知识卡片
消息传递系统的核心设计选择:丢弃、缓冲、背压与持久性代价
内容
判断一套消息传递系统的行为特征,可以拿两个问题去问它。第一,如果生产者发消息比消费者处理得快会怎样?无非三种选择——直接丢消息、放进缓冲队列、或者用背压(也叫流量控制)反向阻塞生产者(Unix管道和TCP用的正是固定大小小缓冲区+阻塞发送方这种背压机制);如果选缓冲,还要接着问队列装不进内存时是崩溃还是溢出到磁盘,磁盘访问又会怎样拖累性能。第二,如果节点崩溃或掉线会怎样?是否会丢消息,取决于持久性投入了多少(写磁盘、复制,或两者组合),而持久性从来不是免费的:能接受偶尔丢消息(比如周期性上报的传感器读数),往往能在同样硬件上换来更高吞吐量和更低延迟;但如果是在做事件计数这类每条消息都要精确计入结果的场景,可靠送达就变得至关重要,因为每条丢失的消息都会让计数器的误差累积放大。发散:这两个问题的答案组合起来,基本上就能定位一套消息系统在”低延迟高吞吐但可能丢数据”和”强可靠但更慢更重”这条光谱上处在什么位置。
参考来源
- 位置:《数据密集型应用系统设计》第十一章《流处理》"消息传递系统"(源文件:_epub-src/ch11_split_000.html)
- 结论依据:原文提出区分消息传递系统的两个关键问题(生产者过快时的丢弃/缓冲/背压选择,节点故障时的消息丢失与持久性代价),并说明是否接受消息丢失取决于应用场景(传感器读数 vs 事件计数),直接支撑本卡片结论。
- 原始内容:如果生产者发送消息的速度比消费者能够处理的速度快会发生什么?……如果节点崩溃或暂时脱机,会发生什么情况?……是否可以接受消息丢失取决于应用。