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

Rabbitmq 是否可以在exchange中缓冲消息,直到至少有一个队列可用?,rabbitmq,rabbitmq-exchange,Rabbitmq,Rabbitmq Exchange,我正在寻找一种方法来缓冲exchange接收到的消息,只要至少有一个队列绑定到该exchange RabbitMQ支持它吗 也许有一些解决办法(我没有找到) 编辑 我的用例: 我有一个数据生成器(从外部系统读取实时数据) 我有一个扇出交换,它从生产者那里接收数据 在系统启动时,可能没有使用者,但几分钟后,应该至少有一个使用者创建自己的队列并从2将其绑定到exchange 问题在于步骤2之间的时间太短。三,。没有绑定到步骤1中创建的exchange的队列 当然,这是一种边缘情况,在系统初始化之后,

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

RabbitMQ支持它吗

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

编辑

我的用例:

  • 我有一个数据生成器(从外部系统读取实时数据)
  • 我有一个扇出交换,它从生产者那里接收数据
  • 在系统启动时,可能没有使用者,但几分钟后,应该至少有一个使用者创建自己的队列并从2将其绑定到exchange
  • 问题在于步骤2之间的时间太短。三,。没有绑定到步骤1中创建的exchange的队列

    当然,这是一种边缘情况,在系统初始化之后,队列和交换被绑定,一切都按预期进行

    为什么队列和绑定必须由使用者(而不是生产者)创建?因为我需要一个灵活的设置,在这里我可以添加消费者,而无需更改其他组件代码(例如producer)

    编辑2

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


    我可能会误导你,说有多个消费者。在exchange上需要缓冲区的情况下,只有一个使用者(当它出现在队列中时,它会将所有内容写入时序数据库)。

    如果您想避免因为没有为其配置目标而丢弃消息,请选择“是”。 你应该看看。 这假设在启动(或何时)之前(或何时),创建了备用交换(通常为扇出),并绑定了一个队列(我们称之为notroutedq)。 因此消息不会丢失,它们将存储在notroutedq中

    从那里,您可以设置一种机制,一旦给定的时间过去或绑定添加到主exchange,该机制将重新处理队列中的消息—最有可能将它们重新注入主exchange

    --编辑--

    谢谢你的更新信息。 您能否指出您通常期望过去的消息对消费者有用多长时间

    在您的描述中,您提到了实时数据,可能还有多个消费者来来往往。基于此,我不确定notroutedq中保存的数据有多少有价值,以及您希望以何种频率将其重新发送给消费者。 我在alternate exchange中遇到的情况主要集中在识别丢失的绑定,这样就可以轻松地更正绑定并重新处理消息而不会丢失。
    如果消费者的数量随着时间的推移而变化,并且数据内容是实时的,那么我想知道保留数据的好处。

    RabbitMQ团队监视并有时只回答有关StackOverflow的问题


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

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


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

    感谢您的回复,我希望有一个自动缓冲区,将所有消息绑定到交换后自动添加到队列中,如:[exchange]->[buffer](延迟绑定)->[队列]。您的解决方案要求消费者先处理AE队列,然后处理常规队列,但可能没有其他方法:(我猜您所描述的是一个由使用者创建队列和绑定的设置,这可以解释缓冲的必要性?我可以想出至少两种方法来处理它,一种主要是在RabbitMQ中自动进行的,另一种需要一些外部系统。如果您确认我的假设(或澄清您用例的细节)我们(社区)可能会想出简单的解决方法。我已经添加了有关我的用例的更多信息。根据您的回答,我认为您理解正确。@jmarceli添加了更多的信息请求谢谢您的回答,但是在我的情况下,由生产者创建队列没有任何意义。生产者不知道消费者使用的队列名称(当创建消费者时,队列会动态绑定到所需的交换)。其想法是创建一个灵活的系统,在该系统中,我可以将我想要的任何消费者绑定到生产者填充的任何交换。备用交换解决方案似乎是最佳选择。