不错的 Kafka 思想和实现解析
![](https://img1.doubanio.com/icon/user_normal.jpg)
带着几个问题而来,问题都得到了解答,是本好书;
其实,剖析任何一个软件,都需要从设计理念,宏观架构,微观代码结构,关键技术点 四个方面出发;这本书确实做的不错;
1)理念,或者说目标,是:1)O(1)的消息持久化能力;2)顺序能力;一个很有趣的权衡,是 topic-partition 模型,订阅以 topic 为主,顺序通过 partition 保证,在 顺序 和 可伸缩之前权衡;
2)宏观架构:broker(broker、controller)、zookeeper、producer & consumer;宏观架构上,很类似 PacificA,zookeeper 存储全局 config,管理状态(ISR & topic meta),controller 负责监听和触发各种行为(一坨 listener);
每个 broker,可以承载 某个 partition 的leader 和 follower,ISR 应该是1)leader-replica 的 broker 负责更新,及 fetch request 的拉取情况,这个是一个定时任务,定时扫的;2)controller 监听存活情况,并通过 controller 触发相应动作(看起来只需要通知 leader-replica 的 broker 即可,除非 leader-replica 故障触发重新选举,故障后重启可直接拉 zk 数据);
producer 简单,不细说;consumer group 这个概念很经典;是 kafka 负载均衡消费者的关键,并且,__consumer_offsets 的 key 也是 group + topic 生成;
当然,这种结构也会有这么一个问题:
2-1) 某个 follower-replica 快于其他 follower-replica(但是没快非常多),那么,假设 leader-replica 故障,此 follower-replica 成为 leader;
2-2)在其他 follower-replica 进度追齐之前(假设 acks = all),那实际上 producer 是不会返回的;
2-3)所以,切主的时候,repliaction-lag 的配置,回影响(写)恢复速度
3)微观代码结构,关键在于 broker:是一个典型的 reactor 模式架构;一个 acceptor,一坨 requestor,一坨 handler;
LogManager 模块负责日志,ReplicaManager 负责副本拉取(client)和同步(server),OffsetManager 负责管理订阅点,KafkaApi 对外封装功能,Kafka 负责调度定时任务(包括长轮询、定时任务);
很经典的地方,是日志文件的设计(可以和 rocketmq 对比下):多个 segment 文件,内存里形成 skiplist 结构(根据 offset 名字),便于快速定位具体文件;
index 文件,全量 load 至内存,便于快速定位每个 segment 内的物理偏移量;
当然,rocketmq 使用 mmap 确实是一个不错的点!
4)最后,关键技术点:梳理就没怎么提及了,比如 zero-copy、比如 长轮询等等; 另外,通过两个 epoch 来做 fencing,也很有趣
4-1)controller-epoch:防止 controller 的 zombie;
4-2)partition-epoch:防止 partition 选主的 zombie;
总体来说还是值得一读的, kafka 这种基于 pacificA 的设计,确实是一种很有意思的模式!