RabbitMQ 中,生产者把消息发布到交换机(Exchange),不是直接写业务队列。交换机按绑定(Binding)与路由键把消息送入一个或多个队列,消费者再从队列取走消息。
Table of contents
四个核心对象
| 对象 | 作用 |
|---|---|
| Exchange | 根据规则路由消息,本身通常不长期存消息 |
| Queue | 保存等待消费的消息 |
| Binding | 连接交换机与队列,并携带匹配规则 |
| Routing key | 发布时提供的路由字符串 |
direct 做精确匹配,topic 用点分词和通配符匹配,fanout 忽略路由键广播,headers 按头字段匹配。默认交换机有特殊的按队列名路由规则,但新手也应显式画出拓扑。
Publisher → orders.exchange --order.paid--> billing.queue → Consumer
└--order.*-----> audit.queue
可确认的链路
可靠发送至少需要持久交换机、持久队列、持久消息和 Publisher Confirm。Confirm 表示 Broker 接受了发布,不表示消费者已完成业务。无法路由的消息还需使用 mandatory 与 return 回调,否则它可能被确认但没有进入任何队列。
消费者关闭自动确认,在本地事务成功后 ack;可恢复失败可 nack/reject 并进入受控重试,确定性坏消息送死信队列。不要无限 requeue=true,它会形成热循环。
消息正文使用带版本的事件契约:
{"eventId":"evt-1","type":"OrderPaid","schemaVersion":1,"orderId":"o-9"}
消费者以 eventId 做幂等。运行实验室的重复消费测试下载:
mvn -Dtest=DistributedMechanismsTest#outboxAndIdempotentConsumerSurviveDuplicates test
参考 RabbitMQ Publisher 文档核对发布确认和不可路由消息处理。
下一步
继续阅读08-13 RabbitMQ 可靠性与高级能力,补齐死信、延迟、顺序和幂等。