摸鱼精选第 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 有以下几类锁:
- OSSpinLock:自旋锁,优先级反转,iOS 10 已废弃
- pthread_mutex:跨平台互斥锁,有很多类型,支持递归
互斥类型:
- PTHREAD_MUTEX_NORMAL 正常
- PTHREAD_MUTEX_ERRORCHECK 错误检测
- PTHREAD_MUTEX_RECURSIVE 递归
- PTHREAD_MUTEX_DEFAULT 就是正常
- NSLock:纯 iOS 下的高级封装互斥锁,内部实现是 pthread_mutex
- dispatch_semaphore:GCD 的信号量
- @synchronized:最简单的高级递归锁,语法简单,性能差,少用为妙
- NSConditionLock:高级条件锁,内部封装了一个互斥锁和一个条件变量 NSCondition,本质就是生产者-消费者模式
- pthread_rwlock_t:跨平台的读写锁,读锁能允许多个线程同时去读,但是写锁在同一时刻只允许一个线程去写。适合于多读少写的情况,如果读写一样多,那么选择 mutex lock。
- NSRecursiveLock:pthread_mutex_lock 函数来实现,互斥属性 类型为 PTHREAD_MUTEX_RECURSIVE;
6. 颠覆 Kafka 统治,Pulsar 横空出世!
- Pulsar 架构
计算与存储分离的模式。
- Producer:发送消息的端
- Consumer:接收消息的端
- Broker:接收消息、传递消息、负载均衡
- BookKeeper:有状态的持久层
- ZooKeeper:存储元数据、集群配置,负责集群协调、服务发现
- Topic
- 分区 Topic:被多个 Broker 处理,更高吞吐量
- 非持久 Topic:默认是持久 Topic,把未确认的消息保存到 BookKeeper。非持久 Topic 保存在内存中,宕机、重启就没了。
- 重试 Topic
- 死信 Topic:重试多次失败之后变成死信 Topic
- 订阅
订阅类型包括独占、灾备、共享、Key_shared 四种。
订阅模式包括持久化和非持久化,取决于游标(cursor)的类型。游标类型有 Durable(持久订阅) 和 NonDurable(非持久订阅),持久订阅会重上一个记录的最后一条消息开始消费。
多主题订阅,包括指定 Topic 和正则表达式。
-
Producer
- 访问模式:Shared,Exclusive,WaitForExclusive
- 路由模式:RoundRobinPartition,SinglePartition,CustomPartition
- 批量处理:索引确认机制,key-based batching
- 消息分块
- 处理一个 producer 和一个订阅 consumer 的分块消息
- 多个生产者和一个生产者处理块消息
-
Consumer
- 消息确认:累积确认,单条确认,AcknowledgmentsGroupingTracker 处理
- 取消确认:可以批量处理,NegativeAcksTracker 处理
- redelivery backoff 机制:消息重试
- 确认超时
- 消息预拉取
- 未确认的消息处理
-
Broker 负责 http 服务,调度器
- 消息确认与留存
- 消息去重:每个消息有一个 sequenceID
- 消息延迟传递:先保存在 BookKeeper,到了时间传递给 Consumer
- Bundle:可以根据绑定的 Broker 的负载进行动态的调整、绑定
-
Bookkeeper 分片存储,存储粒度更细化、负载更均衡
7. iOS 自动化打包(三)Fastlane
Fastlane 打包是比较灵活的,有很多插件可用。因为是基于 ruby 脚本语言的,所以可以自定义各种参数和方法,不局限于官方的插件。
8. 抛砖引玉:TypeScript 从入门到实践
本文用很大篇幅介绍了 TypeScript 的基本类型,以及内置的高级函数。