消息队列

通过持久化消息解耦生产者与消费者,实现异步处理、削峰、重试和回放

本文是消息投递、异步解耦与可靠性语义的通用入口;Kafka 产品机制见 Kafka,系统化书摘见 Kafka: The Definitive Guide

  • S:分布式系统需要跨服务传递事件、异步处理副作用,并承接短时间的突发流量。
  • C:同步调用会让生产者受消费者延迟和故障影响;直接发送又难以保证消息持久化、失败重试和事件回放。
  • Q:如何让生产者与消费者独立演进,同时可靠地传递、缓冲和重复消费消息?
  • A:消息队列持久化生产者发布的消息,由消费者按自己的速度读取;通过确认、重试和幂等消费控制投递可靠性。

消息队列把立刻必须完成的核心操作可以稍后完成的副作用操作拆开。

核心不变量同步保证,副作用异步处理。

  1. 异步化
  2. 解耦
  3. 削峰填谷
  4. 失败重试
  5. 广播事件
  6. 顺序处理
  7. 可回放

事件驱动:生产者发布事实,消费者根据自己的需求订阅事实。

消息投递语义:

  1. At most once:最多一次。可能丢,不重复。
  2. At least once:至少一次。不丢,但可能重复。
  3. Exactly once:看起来刚好一次,但实现条件严格。 常用 At least once + 幂等消费
  • Outbox Pattern:本地事务 + 事件可靠发送
  • Saga:跨服务业务流程:把一个大事务拆成多个本地事务,每一步都有对应的补偿操作

评论