知识卡片

重播旧消息让基于日志的消息传递更接近批处理哲学

普通读书笔记卡

内容

在AMQP/JMS风格代理里,处理并确认一条消息是破坏性操作——确认会导致消息从代理删除,所以你没法指望重跑同一个消费者能得到相同结果;新加入的消费者也只能收到它注册之后产生的消息,历史消息一去不复返。基于日志的消息代理彻底反转了这个模型:消费日志更像是从文件读数据,是只读操作,不会更改日志本身,处理的唯一副作用是消费者偏移量往前移动——而偏移量完全在消费者自己控制之下,可以随意操纵,比如用昨天的偏移量重新起一个消费者副本、把输出写到别处,用不同处理代码重复处理同一段历史消息任意次。这正是[[批处理输出的三种目的与不可变输出带来的人类容错]]里”输入不可变、可以放心实验、能从错误代码恢复”那套哲学在流处理领域的翻版:衍生数据通过一个可重复的转换过程与输入数据显式分离,这既方便实验,也让组织内部集成数据流变得容易得多。

参考来源

- 位置:《数据密集型应用系统设计》第十一章《流处理》"重播旧消息"(源文件:_epub-src/ch11_split_000.html) - 结论依据:原文对比AMQP/JMS消费消息的破坏性(确认后删除、新消费者收不到历史消息)与基于日志消费的只读特性(偏移量可操纵、可重复重播),并指出这使基于日志的消息传递更像批处理里可重复的转换过程,直接支撑本卡片结论。 - 原始内容:在基于日志的消息代理中,使用消息更像是从文件中读取数据:这是只读操作,不会更改日志……这一方面使得基于日志的消息传递更像上一章的批处理,其中衍生数据通过可重复的转换过程与输入数据显式分离。