在 Rabbit MQ 中是否有等效于 Active MQ 虚拟主题?或任何其他机制实现队列语义。一些主题订阅者需要在他们重新上线时传递持久消息,并进行负载平衡。
编辑
有多个消费者,他们很少有丢失消息的余地,因为他们只是实时行动;很少有人不这样做,因为他们需要历史数据。
作为一个简单的例子,只要用户登录失败,就会从主应用程序发布一条消息。其中一位听众会为每次登录失败发送一封电子邮件,而另一位听众需要在一天内发生 5 次失败时发送一封电子邮件。
在 Rabbit MQ 中是否有等效于 Active MQ 虚拟主题?或任何其他机制实现队列语义。一些主题订阅者需要在他们重新上线时传递持久消息,并进行负载平衡。
编辑
有多个消费者,他们很少有丢失消息的余地,因为他们只是实时行动;很少有人不这样做,因为他们需要历史数据。
作为一个简单的例子,只要用户登录失败,就会从主应用程序发布一条消息。其中一位听众会为每次登录失败发送一封电子邮件,而另一位听众需要在一天内发生 5 次失败时发送一封电子邮件。
我对 ActiveMQ 不是很熟悉,所以这是基于 AMQ 的文档示例的一些猜测。
虚拟主题和复合目的地之间的主要区别在于,对于复合目的地,消费者目的地的列表是静态的并且是硬连线的。而在运行时使用虚拟主题,可以动态创建新的消费者或队列并将其添加到订阅中,而无需重新配置代理。
和这个页面(http://activemq.apache.org/virtual-destinations.html):
但是,如果主题是虚拟的,消费者可以从物理队列中消费逻辑主题订阅,从而允许许多消费者在许多机器和线程上运行以平衡负载。
从我在这里阅读的内容来看,ActiveMQ 中的一个虚拟主题是 RabbitMQ 路由键和队列绑定的工作方式。
您可以让消息使用者定义一个与交换绑定的队列,并随时订阅该队列。您也可以创建具有多个消费者的单个队列。
上面的短语之一,对于 ActiveMQ 来说很突出:“无需重新配置代理”
使用 RabbitMQ,您始终能够在运行时重新配置代理。代理没有单独的设计时间。RabbitMQ 拓扑的整个布局是通过生成和使用消息的相同协议定义的。这为您提供了很大的灵活性以及动态创建绑定和队列并根据需要使用它们的能力。当您的消费者完成后,它可以销毁它创建的队列。无需重新设计或重启 RabbitMQ。
如果你需要 RabbitMQ 的持久性,你需要考虑一些事情。消息中的持久性?(原样,持久化到磁盘)或队列中的持久性保持活动状态并保存消息?
消息持久性(保存到磁盘)允许消息在 RabbitMQ 死亡并重新上线时仍然存在……也就是说,当消息代理本身关闭并重新启动时。与将消息保存在内存中相比,这是一件非常昂贵的事情。不过,有时它很重要,而且值得付出代价。
听起来您在谈论队列持久性,但是……即使队列中附加了零个消费者,队列也将保持活动状态并继续接收消息。然后,当消费者再次附加到队列时,它将从队列中接收消息。这是队列配置的“持久”和“自动删除”的组合。
当rabbitmq(代理)关闭并重新启动时,持久队列将继续存在。这可能就是你想要的。
当没有更多消费者连接到队列时,“自动删除”队列将自行删除。如果您需要队列在没有消费者的情况下生存,请务必将 autodelete 设置为 false(我认为这是默认设置。但最好明确并将其设置为 false)。
希望有帮助!
PS 使用虚拟主题“从物理队列消费逻辑主题订阅”的想法听起来很像“选择性消费者”模式……这是RabbitMQ 中的一种反模式。