知识卡片

直接消息传递的局限:容错程度极为有限

普通读书笔记卡

内容

一大类消息系统绕开中间节点,直接在生产者和消费者之间建立网络通信:UDP组播(金融行业股票市场常用,靠应用层协议自己重传丢包)、ZeroMQ/nanomsg这类无代理消息库(用TCP或IP多播实现发布订阅)、StatsD/Brubeck这类靠不可靠UDP采集监控指标的工具(只有收到所有消息计数器才算准确,本质是接受”最佳近似”)、以及webhooks(服务把回调URL注册到另一个服务,事件发生时对方直接发HTTP/RPC请求推送过来)。这些方案在各自设计的场景里运行良好,但共同的软肋是容错能力极为有限:多数只假设生产者和消费者始终在线,即使协议能检测并重传网络中丢失的数据包,如果消费者本身处于离线状态,发送给它的消息就会真正丢失;即使生产者支持重试失败的投递,一旦生产者自己崩溃,它连同尚未发出的消息缓冲区也一并没了,重试机制形同虚设。发散:直接消息传递把”确保消息不丢”的责任几乎全部甩给了应用代码,这正是后面引出消息代理(把持久性问题集中到一个专门角色身上)的动机所在。

参考来源

- 位置:《数据密集型应用系统设计》第十一章《流处理》"直接从生产者传递给消费者"(源文件:_epub-src/ch11_split_000.html) - 结论依据:原文列举UDP组播、ZeroMQ类无代理库、StatsD/Brubeck、webhooks四种直接消息传递方式,并指出它们通常假设生产者消费者始终在线、消费者离线或生产者崩溃时消息会真正丢失,直接支撑本卡片结论。 - 原始内容:尽管这些直接消息传递系统在设计它们的环境中运行良好,但是它们通常要求应用代码意识到消息丢失的可能性……如果消费者处于脱机状态,则可能会丢失其不可达时发送的消息。