投递、确认与重试
可靠消息处理需要明确两个问题:操作返回时,哪些工作已经完成;返回结果丢失时,可能发生什么。答案取决于发送路径、存储策略、消费模型和业务事务。
区分完成边界
| 边界 | 已发生的事情 | 仍然独立的部分 |
|---|---|---|
| 已接受 | 所选 Broker 写入路径接受了消息 | 要求的磁盘/副本等待与可见性 |
| 按策略持久化 | 相应持久化/复制条件已完成 | 超出该策略的更强故障模型 |
| 可见 | 所选读取路径能够发现消息 | 投递给所有消费者 |
| 已投递 | 客户端取得了消息 | 业务副作用 |
| 已处理 | 应用完成了业务工作 | 消费进度持久化 |
| 进度已记录 | 所选进度/ACK 路径已推进 | 与外部数据库之间的原子事务 |
消息主日志及其派生结构承担不同职责。建立 ConsumeQueue、索引或定时视图,不能增强之前的写入确认。副本连接健康,也不同于等待副本进度后才返回确认。