发件人有回执
Confirm、Return 和本地消息表,解决“发出后不知道成没成”。
用户余额扣减成功后,支付服务把“支付成功”告诉交易服务。
Confirm、Return 和本地消息表,解决“发出后不知道成没成”。
ACK、重试和错误队列,解决“拿到了但处理失败”。
延迟消息做超时关单;仲裁队列和多节点连接提高可用性。
把消息当快递,就容易分清 Confirm 和 Return。
| 机制 | 它回答的问题 | 失败时怎么办 |
|---|---|---|
| Confirm | Broker 的交换机收到消息了吗? | 收到 nack 或发送异常,记录失败并准备重发。 |
| Return | 交换机能把消息路由进队列吗? | 开启 mandatory;不可路由时收到退回通知,检查 routing key / 绑定。 |
| 本地消息表 | 进程崩溃、连接断开时,原消息还在吗? | 先把消息存数据库,再发送;失败或待发送的消息定时重试。 |
“店铺、货架、包裹”都要能保留下来。
交换机本身持久化,重启后路由入口才保留。
队列本身持久化,重启后收件位置才保留。
消息也要持久化,Broker 才会尽力在重启后保留消息。
先确认有没有处理成功,再决定重试还是转存。
网络抖动可能重试成功;代码错误通常不会。无限重试会卡住队列,所以耗尽后把原消息和异常留在错误队列,供排查补偿。
业务成功,但 ACK 丢失,Broker 可能再次投递。因此业务还需幂等:例如订单已支付,就不要重复处理。
延迟消息就是“现在寄出,指定时间后才交给消费者”。
订单待支付,同时发出 35 分钟后到达的消息。
支付服务先检查期限;过期就拒绝扣余额。
交易服务收到消息;若仍未支付,取消订单并回补库存。
| 方案 | 消息怎么“等” | 关键点 |
|---|---|---|
| TTL + 死信交换机 | 先进入带过期时间的队列,过期后转发到目标交换机。 | 原生 TTL 和 DLX 组合。 |
| 延迟消息插件 | 投给 x-delayed-message 交换机,发送时设置 x-delay。 | Broker 必须安装并启用插件。 |
讲义介绍普通集群、镜像集群和仲裁队列。先看“消息数据有没有副本”。
| 类型 | 通俗理解 | 特点 |
|---|---|---|
| 普通集群 | 多个站点知道队列在哪里,消息主要留在所属节点。 | 队列所属节点故障仍可能影响它。 |
| 镜像集群 | 把队列内容复制到多个节点。 | 讲义用于理解历史方案;同步和维护有成本。 |
| 仲裁队列 | 多个节点保存副本,由多数节点达成一致。 | 通常需要多个节点验证故障切换。 |
讲义作业:30 分钟内不支付则不可再支付,35 分钟后自动取消未支付订单。
短延迟和回拨时间模拟到期:订单取消,库存回补;取消后支付被拒绝,余额未扣。
延迟消息到达后仍保持已支付状态;支付成功消息由 outbox 保存并发送。
错题会给出解释。
前 5 分钟:画四站消息链路,写出每站的故障。
接着 7 分钟:自己讲 Confirm、Return、持久化、ACK、重试和错误队列。
再用 5 分钟:画订单 0 / 30 / 35 分钟时间线。
最后 3 分钟:做小测,勾选清单。