Skip to main content

摸鱼精选第 17 期

1. lru-cache

面向 Node 的 LRU 缓存实现。

2. Fastify

快速、低开销的 Web 框架。比 Express 有 5 倍的的性能提升。

3. 通过 Play Integrity API 的 nonce 字段提高应用安全性

nonce在接口里经常用,表示在网络请求里只用一次的随机字符串。不要小瞧nonce的作用,在身份验证、数据加密等发挥重要作用。另外,nonce还可以防范重放攻击,免受恶意攻击。

4. Sanitizers 系列之 address sanitizer 原理篇

主要介绍 asan 的算法,asan 的各种优势本质上是源自于它的算法。

5. iOS 下锁的独白

iOS 有以下几类锁:

  1. OSSpinLock:自旋锁,优先级反转,iOS 10 已废弃
  2. pthread_mutex:跨平台互斥锁,有很多类型,支持递归 互斥类型:
    1. PTHREAD_MUTEX_NORMAL 正常
    2. PTHREAD_MUTEX_ERRORCHECK 错误检测
    3. PTHREAD_MUTEX_RECURSIVE 递归
    4. PTHREAD_MUTEX_DEFAULT 就是正常
  3. NSLock:纯 iOS 下的高级封装互斥锁,内部实现是 pthread_mutex
  4. dispatch_semaphore:GCD 的信号量
  5. @synchronized:最简单的高级递归锁,语法简单,性能差,少用为妙
  6. NSConditionLock:高级条件锁,内部封装了一个互斥锁和一个条件变量 NSCondition,本质就是生产者-消费者模式
  7. pthread_rwlock_t:跨平台的读写锁,读锁能允许多个线程同时去读,但是写锁在同一时刻只允许一个线程去写。适合于多读少写的情况,如果读写一样多,那么选择 mutex lock。
  8. NSRecursiveLock:pthread_mutex_lock 函数来实现,互斥属性类型为 PTHREAD_MUTEX_RECURSIVE;

6. 颠覆 Kafka 统治,Pulsar 横空出世!

  1. Pulsar 架构

计算与存储分离的模式。

  • Producer:发送消息的端
  • Consumer:接收消息的端
  • Broker:接收消息、传递消息、负载均衡
  • BookKeeper:有状态的持久层
  • ZooKeeper:存储元数据、集群配置,负责集群协调、服务发现
  1. Topic
  • 分区 Topic:被多个 Broker 处理,更高吞吐量
  • 非持久 Topic:默认是持久 Topic,把未确认的消息保存到 BookKeeper。非持久 Topic 保存在内存中,宕机、重启就没了。
  • 重试 Topic
  • 死信 Topic:重试多次失败之后变成死信 Topic
  1. 订阅

订阅类型包括独占、灾备、共享、Key_shared 四种。

订阅模式包括持久化和非持久化,取决于游标(cursor)的类型。游标类型有 Durable(持久订阅) 和 NonDurable(非持久订阅),持久订阅会重上一个记录的最后一条消息开始消费。

多主题订阅,包括指定 Topic 和正则表达式。

  1. Producer

    1. 访问模式:Shared,Exclusive,WaitForExclusive
    2. 路由模式:RoundRobinPartition,SinglePartition,CustomPartition
    3. 批量处理:索引确认机制,key-based batching
    4. 消息分块
      1. 处理一个 producer 和一个订阅 consumer 的分块消息
      2. 多个生产者和一个生产者处理块消息
  2. Consumer

    1. 消息确认:累积确认,单条确认,AcknowledgmentsGroupingTracker 处理
    2. 取消确认:可以批量处理,NegativeAcksTracker 处理
    3. redelivery backoff 机制:消息重试
    4. 确认超时
    5. 消息预拉取
    6. 未确认的消息处理
  3. Broker 负责 http 服务,调度器

    1. 消息确认与留存
    2. 消息去重:每个消息有一个 sequenceID
    3. 消息延迟传递:先保存在 BookKeeper,到了时间传递给 Consumer
    4. Bundle:可以根据绑定的 Broker 的负载进行动态的调整、绑定
  4. Bookkeeper 分片存储,存储粒度更细化、负载更均衡

7. iOS 自动化打包(三)Fastlane

Fastlane 打包是比较灵活的,有很多插件可用。因为是基于 ruby 脚本语言的,所以可以自定义各种参数和方法,不局限于官方的插件。

8. 抛砖引玉:TypeScript 从入门到实践

本文用很大篇幅介绍了 TypeScript 的基本类型,以及内置的高级函数。