消息队列
通过持久化消息解耦生产者与消费者,实现异步处理、削峰、重试和回放
本文是消息投递、异步解耦与可靠性语义的通用入口;Kafka 产品机制见 Kafka,系统化书摘见 Kafka: The Definitive Guide。
- S:分布式系统需要跨服务传递事件、异步处理副作用,并承接短时间的突发流量。
- C:同步调用会让生产者受消费者延迟和故障影响;直接发送又难以保证消息持久化、失败重试和事件回放。
- Q:如何让生产者与消费者独立演进,同时可靠地传递、缓冲和重复消费消息?
- A:消息队列持久化生产者发布的消息,由消费者按自己的速度读取;通过确认、重试和幂等消费控制投递可靠性。
消息队列把
立刻必须完成的核心操作和可以稍后完成的副作用操作拆开。
核心不变量同步保证,副作用异步处理。
- 异步化
- 解耦
- 削峰填谷
- 失败重试
- 广播事件
- 顺序处理
- 可回放
事件驱动:生产者发布事实,消费者根据自己的需求订阅事实。
消息投递语义:
- At most once:最多一次。可能丢,不重复。
- At least once:至少一次。不丢,但可能重复。
- Exactly once:看起来刚好一次,但实现条件严格。 常用 At least once + 幂等消费
- Outbox Pattern:本地事务 + 事件可靠发送
- Saga:跨服务业务流程:把一个大事务拆成多个本地事务,每一步都有对应的补偿操作
评论