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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以在至少有一个队列可用的情况下缓冲消息?相关的知识,希望对你有一定的参考价值。

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

RabbitMQ是否支持它?

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

编辑

我的用例:

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

问题是步骤2和3之间的这个短时间,其中没有队列绑定到步骤1中创建的交换。

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

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

编辑2

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

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

答案

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


为什么队列和绑定必须由消费者(而不是生产者)创建?

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

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

另一答案

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

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

- 编辑 -

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

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

以上是关于是否可以在至少有一个队列可用的情况下缓冲消息?的主要内容,如果未能解决你的问题,请参考以下文章

一文读懂消息队列的一些设计

扔硬币

消息队列相关

消息队列简介

获取环形缓冲区中的当前消息数

mysql实现消息队列