Rabbitmq 虚拟主题?

Rabbit MQ virtual topics?

在 Rabbit MQ 中是否有与 Active MQ Virtual Topics 等效的东西? 或者任何其他机制实现队列语义。一些主题订阅者需要在他们重新上线时传递持久消息和负载平衡。

编辑

有多个消费者,他们很少有丢失消息的余地,因为他们只在实时基础上行动;很少有人不这样做,因为他们需要历史数据。

作为一个简单的例子,只要用户登录失败,主应用程序就会发布一条消息。其中一个监听器会在每次登录失败时发送一封电子邮件,而另一个监听器则需要在一天内失败 5 次时发送一封电子邮件。

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

查看此页面 (http://activemq.apache.org/what-is-the-difference-between-a-virtual-topic-and-a-composite-destination.html):

The main difference between a Virtual Topic and a Composite Desetination is that with a Composite Destination the list of consumer destinations is static and hard wired. Whereas with a Virtual Topic at run time a new consumer or queue can be created dynamically and addded to the subscription without having to reconfigure the broker.

和此页面 (http://activemq.apache.org/virtual-destinations.html):

However if the topic is virtual, consumer can consume from a physical queue for a logical topic subscription, allowing many consumers to be running on many machines & threads to load balance the load.

根据我在这里阅读的内容,ActiveMQ 中的虚拟主题已经是 RabbitMQ 路由键和队列绑定的工作方式。

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

上面的短语之一,代表 ActiveMQ:"without having to reconfigure the broker"

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

如果您需要使用 RabbitMQ 进行持久化,则需要考虑一些事项。消息的持久性? (如,持久化到磁盘)或队列中的持久化保持活动状态并保存消息?

消息持久性(保存到磁盘)允许消息在 RabbitMQ 死机并重新联机时继续存在...也就是说,当消息代理本身关闭并重新启动时。与将消息保存在内存中相比,这是一件非常昂贵的事情。不过,有时它很重要,值得付出代价。

听起来您在谈论队列持久性,但是...队列将保持活动状态并继续接收消息,即使有零个消费者附加到队列也是如此。然后,当消费者再次附加到队列时,它将从队列中接收消息。这是队列配置的 "durable" 和 "auto-delete" 的组合。

当 rabbitmq(代理)关闭并重新启动时,持久队列将继续存在。这可能就是你想要的。

当没有更多消费者连接到队列时,"autodelete" 队列将自行删除。如果您需要队列在没有消费者的情况下存活下来,请务必将 autodelete 设置为 false(我认为这是默认设置。但最好是显式设置并将其设置为 false)。

希望对您有所帮助!

P.S。 "consume from a physical queue for a logical topic subscription" 与虚拟主题的想法听起来很像 "selective consumer" 模式......即 an anti-pattern in RabbitMQ.