RabbitMQ发送3条不同路由键消息,仅消费2队列却出现随机消费问题
RabbitMQ 消息随机消费问题解析
核心原因
这是因为同一个队列的消息会被RabbitMQ以轮询(round-robin)策略分发给绑定到该队列的所有消费者,和消费者与交换机的路由键绑定无关。具体逻辑拆解:
- 你的
order直连交换机,会根据消息的路由键,把order.notify和order.report的消息路由到order_notify队列(因为两个消费者分别给这个队列绑定了对应的路由键,相当于队列同时关联了这两个路由规则);而order.test的消息因为没有对应的队列绑定,会被交换机丢弃。 - 一旦消息进入
order_notify队列,RabbitMQ就只认队列的消费者列表,默认用轮询方式挨个给消费者发消息——不管这个消费者原本是冲着哪个路由键来的。所以order.notify的消息可能被report.py接收到,order.report的消息也可能被notify.py接收到,看起来就是“随机消费”。
解决办法
最合理的方案是给两个消费者分配独立的队列:
- 给
report.py创建专属队列(比如order_report_queue),将其与order交换机绑定,路由键设为order.report。 - 给
notify.py创建专属队列(比如order_notify_queue),将其与order交换机绑定,路由键设为order.notify。
这样交换机就会把对应路由键的消息精准投递到各自队列,每个消费者只处理自己队列里的目标消息,不会出现串接的情况。
如果非要共用队列(不推荐,浪费资源),可以在消费端接收到消息后,判断消息的路由键,只处理自己关心的,忽略其他路由键的消息。
内容的提问来源于stack exchange,提问作者DIPESH RISHI
相关产品推荐
相关产品推荐

