知识卡片

消费者偏移量类比复制日志序列号,与磁盘环形缓冲区效应

普通读书笔记卡

内容

在[[基于日志的消息代理分区偏移量与传统代理的权衡]]里,单线程顺序消费一个分区带来一个额外的好处:判断消息是否处理过变得非常简单——所有偏移量小于消费者当前偏移量的消息都已处理,代理因此不需要像传统代理那样为每条消息单独记账确认,只需定期记录消费者的偏移量即可,这大幅降低了簿记开销。这套机制在本质上等价于[[四种复制日志实现方式在耦合度与兼容性上的权衡]]里单领导者复制依赖的日志序列号——从库靠日志序列号断线重连后从断点继续、不跳过任何写入;这里消息代理扮演的角色相当于主库,消费者相当于从库。另一方面,由于日志不能无限增长,磁盘空间要靠把日志切成段、定期删除或归档旧段来回收,这意味着日志实际上构成了一个巨大但有限的循环/环形缓冲区:一块6TB、顺序写入吞吐150MB/s的硬盘写满大约需要11小时,也就是能缓冲11小时的消息(实践中很少用满写入带宽,通常能撑到几天甚至几周),一旦慢消费者的偏移量指向已被删除的段,它就会永久错过那部分消息。发散:这个”磁盘做的环形缓冲区”设计让基于日志的消息代理的吞吐量几乎不受历史保留时长的影响——因为无论如何每条消息都要写一次磁盘,这与”消息短时间内堆积才落盘”的传统代理形成鲜明对比。

参考来源

- 位置:《数据密集型应用系统设计》第十一章《流处理》"消费者偏移量""磁盘空间使用"(源文件:_epub-src/ch11_split_000.html) - 结论依据:原文说明顺序消费单分区使代理只需记录偏移量而非逐条确认、并将其类比为单领导者复制的日志序列号,随后给出6TB硬盘11小时写满的具体计算说明日志本质是磁盘上的大号环形缓冲区,直接支撑本卡片结论。 - 原始内容:这种方法减少了额外簿记开销……这里原理完全相同:消息代理表现得像一个主库,而消费者就像一个从库……因而磁盘可以缓冲11个小时的消息,之后它将开始覆盖旧的消息。