如何在直接交换中将消息广播给所有具有相同队列名称/路由键值的订阅者

0 投票
1 回答
1886 浏览
提问于 2025-04-16 00:38

想象一下,有一群N个订阅者,它们都通过相同的队列名称和路由键连接到一个直接交换机。这就像一个负载均衡的系统,意味着每当有新消息进来时,这些消息会轮流发送给其中一个订阅者。这样做非常适合处理扩展问题,因为当负载增加时,可以添加更多的订阅者,如果需要的话,也可以把它们撤回。

现在,假设你需要向这个层级中的所有订阅者发送消息,但你并不知道具体有多少个订阅者(比如发送一个“重置状态”或者“请立即关闭”的管理消息)。在rabbitmq中,有没有办法做到这一点?如果不行,有没有更好的方法?

我的环境是使用amqplib的Python。

1 个回答

2

如果我理解得没错,你的设置是这样的:

  • 你有一个生产者,它向一个直接交换机发送消息;
  • 你有一个队列与这个交换机相连;
  • 你有很多订阅者,都是从上面的队列中获取消息。

这样做可以很好的将消息发送给任意一个订阅者(这算是一种负载均衡),但你希望能够将某些消息发送给所有的订阅者。

你可以使用一个广播交换机,并为每个订阅者设置一个额外的队列来实现这个功能:

  • 你的生产者向一个广播交换机发送系统范围内的消息;
  • 每个订阅者都有一个与这个交换机相连的队列;
  • 每个订阅者首先尝试从这个队列中获取消息;如果没有成功,它就会尝试从你现在使用的公共队列中获取。

撰写回答