我正在寻找一种缓冲交换机接收的消息的方法,只要至少有一个队列绑定到该交换机。
RabbitMQ是否支持它?
也许有一些解决方法(我没有找到)。
修改
我的用例:
问题是步骤2和3之间的这个短时间。在步骤1中创建的交换没有绑定队列。
当然,它是一个边缘案例,在系统初始化后,队列和交换被绑定,一切都按预期工作。
为什么必须由消费者(而不是制作人)创建队列和绑定?因为我需要一个灵活的设置,我可以添加消费者而不需要对其他组件代码进行任何更改(例如,生产者)。
编辑2
我处理来自另一个存储实时和历史数据的系统的输出。在某些情况下,我想先读取历史数据(初始化时),然后继续处理实时数据。
我可能会误导你说有多个消费者。在我需要交换缓冲区的情况下,只有一个消费者(它将所有内容写入队列中的时间序列DB)。
答案 0 :(得分:1)
如果您的意思是避免丢弃消息,因为没有为其配置目的地,是的。 你应该看看alternate exchange。 这假设在您开始(或何时)之前(或何时),创建备用交换(通常用于扇出)并且将队列绑定到它(让我们将其称为notroutedq)。 因此消息不会丢失,它们将存储在notroutedq中。
从那里你可以设置一个机制来重新处理该队列中的消息 - 最有可能将它们重新注入主交换中 - 一旦给定时间过去或者将绑定添加到主交换中。
- 编辑 -
感谢您提供最新信息。 您是否可以指出您通常希望过去的消息对消费者有用多长时间?
在您的描述中,您提到了实时数据,可能还有多个消费者来来往往。基于此,我不确定notroutedq中保留的数据有多少,以及您期望将它们重新发送给消费者的频率。 我与备用交换的情况主要集中在识别缺失的绑定,以便人们可以轻松地纠正绑定并重新处理消息而不会丢失。 如果消费者的数量随时间变化而且数据内容是实时的,我会对保留数据的好处有所了解。
答案 1 :(得分:1)
RabbitMQ团队监控this mailing list,有时只回答StackOverflow上的问题。
为什么消费者(而不是制作人)必须创建队列和绑定?
生产者或使用者或都可以创建队列和绑定。要求是,如果客户端应用程序试图重新创建"则在创建它们时使用完全相同的参数。队列或绑定。如果使用不同的参数,则会发生通道级错误。
正如您所发现的,如果制作人发布到无法路由消息的交易所,他们将会丢失。 Olivier建议使用备用交换是一个很好的建议,但我建议您让生产者创建队列和绑定。