rabbitmq 是否可以在交换中缓冲消息,直到至少有一个队列可用?

yzuktlbb  于 2023-10-20  发布在  RabbitMQ
关注(0)|答案(2)|浏览(127)

我正在寻找一种方法,只要至少有一个队列绑定到交换机,就可以缓冲交换机接收的消息。
RabbitMQ支持吗?
也许有一些变通办法(我没有找到任何)。

编辑

我的用例:
1.我有一个数据生成器(从外部系统读取实时数据)
1.我有一个扇出交换器,它从生产者那里接收数据
1.在系统启动时,可能没有消费者,但过了一会儿,至少应该有一个消费者创建自己的队列并将其绑定到来自2的交易所。
问题是步骤2之间的时间很短。以及3.没有队列绑定到步骤1中创建的交换机。
当然,这是一种边缘情况,在系统初始化之后,队列和交换被绑定,一切都按预期工作。
为什么队列和绑定必须由消费者(而不是生产者)创建?因为我需要一个灵活的设置,在那里我可以添加消费者,而不需要对其他组件代码进行任何更改(例如,制片人)。

编辑2

我正在处理另一个系统的输出,这个系统同时存储实时和历史数据。在某些情况下,我想先读取历史数据(在初始化时),然后继续处理实时数据。
我可能会误导你说有多个消费者。在我需要在Exchange上使用缓冲区的情况下,只有一个消费者(它将所有内容写入时间序列DB,因为它出现在队列中)。

o2gm4chl

o2gm4chl1#

为什么队列和绑定必须由消费者(而不是生产者)创建?
绑定和绑定可以由生产者 * 或消费者 * 或两者创建。要求是,如果客户端应用程序试图“重新创建”队列或绑定,则在创建它们时使用完全相同的参数。如果使用不同的参数,则会发生通道级错误。
正如您所发现的,如果生产者发布到无法路由消息的交换,消息将丢失。Olivier关于使用备用交换的建议很好,但我建议您也让生产者创建队列和绑定。

a14dhokn

a14dhokn2#

如果您想避免因为没有为它配置目的地而丢弃消息,那么是的。你应该看看alternate exchange。这假设在您开始之前(或开始时),备用交换机已经创建(通常用于扇出),并且队列绑定到它(让我们称之为notroutedq)。所以消息不会丢失,它们将存储在notroutedq中。
从那里,您可能会设置一种机制,重新处理该队列中的消息-最有可能将它们重新注入到主交换中-一旦给定的时间过去,或者当绑定已添加到主交换时。

--编辑--

感谢更新信息。您能指出您通常希望过去的消息对消费者有用多长时间吗?
在你的描述中,你提到了实时数据和可能的多个消费者来来去去。基于此,我不确定notroutedq中保存的数据有多少是有价值的,以及您希望以何种频率将它们重新发送给消费者。我在alternate exchange中遇到的情况主要集中在识别丢失的绑定,以便可以轻松地纠正绑定并重新处理消息而不会丢失。如果消费者的数量随着时间的推移而变化,并且数据内容是实时的,那么我想知道保留数据的好处。

相关问题