是否可以在至少有一个队列可用的情况下缓冲消息?

时间:2018-02-23 12:07:31

标签: rabbitmq rabbitmq-exchange

我正在寻找一种缓冲交换机接收的消息的方法,只要至少有一个队列绑定到该交换机。

RabbitMQ是否支持它?

也许有一些解决方法(我没有找到)。

修改

我的用例:

  1. 我有一个数据生成器(从外部系统读取实时数据)
  2. 我有一个扇出交换,它接收来自制作人的数据
  3. 在系统启动时,可能没有消费者,但过了一会儿,应该至少有一个创建自己的队列并将其绑定到2的交换。
  4. 问题是步骤2和3之间的这个短时间。在步骤1中创建的交换没有绑定队列。

    当然,它是一个边缘案例,在系统初始化后,队列和交换被绑定,一切都按预期工作。

    为什么必须由消费者(而不是制作人)创建队列和绑定?因为我需要一个灵活的设置,我可以添加消费者而不需要对其他组件代码进行任何更改(例如,生产者)。

    编辑2

    我处理来自另一个存储实时和历史数据的系统的输出。在某些情况下,我想先读取历史数据(初始化时),然后继续处理实时数据。

    我可能会误导你说有多个消费者。在我需要交换缓冲区的情况下,只有一个消费者(它将所有内容写入队列中的时间序列DB)。

2 个答案:

答案 0 :(得分:1)

如果您的意思是避免丢弃消息,因为没有为其配置目的地,是的。 你应该看看alternate exchange。 这假设在您开始(或何时)之前(或何时),创建备用交换(通常用于扇出)并且将队列绑定到它(让我们将其称为notroutedq)。 因此消息不会丢失,它们将存储在notroutedq中。

从那里你可以设置一个机制来重新处理该队列中的消息 - 最有可能将它们重新注入主交换中 - 一旦给定时间过去或者将绑定添加到主交换中。

- 编辑 -

感谢您提供最新信息。 您是否可以指出您通常希望过去的消息对消费者有用多长时间?

在您的描述中,您提到了实时数据,可能还有多个消费者来来往往。基于此,我不确定notroutedq中保留的数据有多少,以及您期望将它们重新发送给消费者的频率。 我与备用交换的情况主要集中在识别缺失的绑定,以便人们可以轻松地纠正绑定并重新处理消息而不会丢失。 如果消费者的数量随时间变化而且数据内容是实时的,我会对保留数据的好处有所了解。

答案 1 :(得分:1)

RabbitMQ团队监控this mailing list,有时只回答StackOverflow上的问题。

  

为什么消费者(而不是制作人)必须创建队列和绑定?

生产者使用者都可以创建队列和绑定。要求是,如果客户端应用程序试图重新创建"则在创建它们时使用完全相同的参数。队列或绑定。如果使用不同的参数,则会发生通道级错误。

正如您所发现的,如果制作人发布到无法路由消息的交易所,他们将会丢失。 Olivier建议使用备用交换是一个很好的建议,但我建议您让生产者创建队列和绑定。