← [ BACK_TO_NOTES ]

Messaging & Queues MOC

异步消息与队列学习入口,先建立 delivery/ack/idempotency/backpressure 基础,再进入 Kafka、RabbitMQ、Redis Stream 的具体模型与选型。

#moc #growing #backend #architecture

[!info] related notes

Messaging & Queues MOC

知识总览

filters:
  and:
    - 'file.ext == "md"'
    - 'file.inFolder("z")'
    - 'this.file.links.contains(file)'
    - 'file.path != this.file.path'
formulas:
  knowledge: 'file.asLink(title)'
properties:
  formula.knowledge:
    displayName: 知识
  note.description:
    displayName: Description
  note.mastery:
    displayName: Mastery
views:
  - type: table
    name: 知识总览
    order:
      - formula.knowledge
      - note.description
      - note.mastery
    columnSize:
      formula.knowledge: 280
      note.description: 760
      note.mastery: 56

[!abstract] 核心认识 消息系统把生产者和消费者在时间、部署与处理速度上解耦,但同时引入重复、乱序、积压、ACK、重试和跨系统一致性。先学可靠性语义,再学具体 Broker。

先区分三种意图

Command / Job
→ “请某个 Worker 完成这件事”

Event
→ “这件事已经发生,感兴趣的下游可以响应”

Event Log
→ “事件历史需要长期保留、独立消费和重放”

产品可能覆盖多个模式,但业务语义不能混用。

推荐阅读顺序

  1. Async Task Queue:为什么把慢任务移出请求链路。
  2. 事件驱动架构:Producer、Event、Consumer 与耦合边界。
  3. 消息投递语义:at-most-once、at-least-once 与 exactly-once 边界。
  4. 幂等消费者:重复投递怎样不重复产生业务效果。
  5. Backpressure:消费者跟不上时怎样限制在途和积压。
  6. 分布式事务:DB 与 Broker 的可靠双写。
  7. Apache Kafka:Partitioned Log、Offset、Retention 与 Replay。
  8. RabbitMQ:Exchange、Queue、ACK、Routing 与 DLQ。
  9. Kafka 与 RabbitMQ 的选型边界。

一条消息的可靠生命周期

Producer
  ↓ publish + id
Broker / Log
  ↓ durable accept / confirm
Consumer
  ↓ process business effect
Business DB / External API
  ↓
ACK / Offset Commit
  ↓ failure handling
Retry / DLQ / Alert / Replay

每个箭头都要定义失败窗口,而不是笼统说“消息可靠”。

三种重点实现

模型代表核心进度最自然的场景
Durable Partitioned LogKafkaConsumer OffsetEvent Stream、CDC、Replay
Routed QueueRabbitMQDelivery + ACKJob、Command、复杂路由、DLQ
Lightweight StreamRedis StreamConsumer Group + PEL已有 Redis 的中小规模消息场景

Kafka

重点:Topic / Partition / Offset、Producer ACK、Replication / ISR、Consumer Group、Rebalance、Retention、Replay、Lag 与 KRaft。

RabbitMQ

重点:Exchange / Queue / Binding、Publisher Confirm、Consumer ACK、Prefetch、Retry / DLX、Quorum Queue。

Redis Stream

重点:Entry ID、Consumer Group、Pending Entries、Claim、Trim 和“何时应该升级为专用消息平台”。

五个核心故障窗口

  1. Producer 发送后超时,不知道 Broker 是否已接收;
  2. Broker 已持久化,但 Producer 没收到 Confirm;
  3. Consumer 已写业务库,但 ACK / Offset Commit 丢失;
  4. ACK / Offset 先提交,业务处理随后失败;
  5. DB 已提交,事件却没有发布。

对应手段可能包括 message ID、幂等键、唯一约束、manual ACK、offset 管理、Transactional Outbox、CDC、DLQ 和补偿。

选型原则

需要长保留 + 独立消费 + Replay / CDC?
→ Kafka

需要 Work Queue + Routing + Retry / DLQ?
→ RabbitMQ

已有 Redis,任务简单且规模有限?
→ Redis Stream / Redis-backed queue

不要只用“吞吐高低”选型,先匹配数据模型和故障语义。

面试检查表

  • ACK / Offset Commit 应该放在业务处理之前还是之后?
  • at-least-once 为什么是常见工程选择?
  • exactly-once 到底覆盖 Broker 内部还是外部业务副作用?
  • Consumer Lag / Queue Depth 上升时如何区分生产过快、消费变慢和分区不均?
  • poison message 为什么不能无限立即重试?
  • DB + Broker 双写为什么需要 Outbox / CDC?
  • 顺序要求是全局、Partition 内、Queue delivery,还是业务最终效果顺序?
创建于 2026/9/4 更新于 2026/9/4
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本