2015-07-22 129 views
0

在Rabbit MQ中是否有与Active MQ虚拟主题相同的功能?或者任何其他机制实现队列语义。某些主题订阅者在重新联机时需要传递持久性消息,并且需要负载平衡。兔子MQ虚拟主题?

编辑

有多个消费者,他们几个都leewway失去消息,因为它们只在实时基础上采取行动;很少有人不需要,因为他们需要历史数据。

作为一个简单的例子,在主应用程序中,只要用户登录失败,就会发布消息。其中一位听众每发送一次登录失败都会发送一封电子邮件,而另一位则需要在一天发生5次失败的情况下发送电子邮件。

回答

2

我对ActiveMQ并不是很熟悉,所以这是基于AMQ的文档示例的一点猜测。

望着这页(http://activemq.apache.org/what-is-the-difference-between-a-virtual-topic-and-a-composite-destination.html):

虚拟主题和复合Desetination之间的主要区别是,一个复合目标消费目的地列表是静态的,硬连线。而在运行时使用虚拟主题时,可以动态创建新的使用者或队列,并将其添加到订阅中,而无需重新配置代理。

,而这个页面(http://activemq.apache.org/virtual-destinations.html):

但是如果主题是虚拟的,消费者可以从逻辑主题订阅物理队列消耗,这让很多消费者要在多台机器上&线程运行负载平衡负载。

从我在这里读到的,ActiveMQ中的一个虚拟主题是RabbitMQ路由键和队列绑定已经工作的方式。

您可以让消息使用者定义一个带有绑定到交换的队列,并随时订阅该队列。您也可以创建一个拥有多个消费者的单个队列。

一个以上的短语,脱颖而出的ActiveMQ:“不必重新配置代理”

随着RabbitMQ的,你总是在运行时重新配置代理的能力。经纪人没有单独的设计时间。 RabbitMQ拓扑的整个布局是通过生成和使用消息的相同协议定义的。这为您提供了很大的灵活性,并且可以动态创建绑定和队列,并根据需要使用它们。当你的消费者完成后,它可以销毁它创建的队列。无需重新设计或重新启动RabbitMQ。

如果您需要RabbitMQ的持久性,您需要考虑几件事情。坚持消息? (as-in,持久化到磁盘)还是持久化在队列中保持活动并持有消息?

消息持久性(保存到磁盘)允许消息在RabbitMQ死亡并重新联机时生存......也就是说,当消息代理自身停止并恢复时。与在内存中保存消息相比,这是一件非常昂贵的事情。有时候,这很重要,而且值得花费。

听起来您正在谈论队列持久性,尽管......队列将保持活跃状态​​,并且即使有零个消费者附加到队列中也会继续接收消息。然后,当消费者重新加入队列时,它将接收队列中的消息。这是队列配置的“持久”和“自动删除”的组合。

当rabbitmq(代理)停机并恢复时,持久队列将继续存在。这可能是你想要的。

当没有更多消费者连接到队列时,“自动删除”队列将自行删除。如果在没有消费者的情况下需要队列生存,请确保将autodelete设置为false(我认为这是默认设置,但将其明确设置为false会很好)。

希望有帮助!

P.S.虚拟主题的“从物理队列中消费逻辑主题订阅”的想法听起来很像“选择性消费者”模式......这是an anti-pattern in RabbitMQ

+0

感谢您提供非常详细的答案。我想要保持队列以及该队列中未被确认的消息,同时牢记原始源代码是一个主题。我不认为这是选择性消费者的情况。多个应用程序/组件需要侦听消息,由于它们只能实时操作(因此,旧消息无关紧要),因此很少有消息可以丢失消息。很少有人不需要,因为他们需要保持/行事历史记录。 – saugata

+0

在这种情况下,每个消费者可能会拥有自己的队列并使用相同的绑定密钥(路由密钥)来确保他们获得所有消息。需要所有消息的消费者将使用一个持久队列。不需要所有消息历史的消费者将使用自动删除队列。如果您需要这些消息才能在rabbitmq崩溃/恢复过程中生存下来,那么发送持久性消息就能做到这一点 –