gpt4 book ai didi

RabbitMQ:带有主题交换的持久消息

转载 作者:行者123 更新时间:2023-12-02 16:52:12 25 4
gpt4 key购买 nike

我对 RabbitMQ 非常陌生。

我已经建立了一个“主题”交换。消费者可以在发布者之后启动。我希望消费者能够接收在启动之前发送且尚未使用的消息。

交换设置有以下参数:

exchange_type => 'topic'
durable => 1
auto_delete => 0
passive => 0

消息使用此参数发布:

delivery_mode => 2

消费者使用 get() 从交换中检索消息。

不幸的是,在任何客户端启动之前发布的任何消息都会丢失。我使用了不同的组合。

我想我的问题是交换不保存消息。也许我需要在发布者和消费者之间有一个队列。但这似乎不适用于通过 key 路由消息的“主题”交换。

我应该如何进行?我使用 Perl 绑定(bind) Net::RabbitMQ (应该没关系)和 RabbitMQ 2.2.0

最佳答案

如果在消息发布时没有连接的消费者可用于处理消息,则需要一个持久队列来存储消息。

交换器不存储消息,但队列可以。令人困惑的部分是,交换可以被标记为“持久”,但这真正意味着,如果您重新启动代理,交换本身仍将存在,但它确实不存在。 > 意味着发送到该交换器的任何消息都会自动保留。

鉴于此,这里有两个选择:

  1. 在启动发布商自行创建队列之前,请执行管理步骤。您可以使用 Web UI 或命令行工具来执行此操作。确保将其创建为持久队列,以便即使没有事件的使用者,它也能存储路由到它的所有消息。
  2. 假设您的消费者被编码为始终在启动时声明(因此自动创建)其交换和队列(并且声明它们是持久的),则只需在之前至少运行一次所有消费者启动任何出版商。这将确保正确创建所有队列。然后,您可以关闭消费者,直到真正需要它们为止,因为队列将持久存储将来路由到它们的任何消息。

我会选择#1。需要执行的步骤可能并不多,您始终可以编写所需步骤的脚本,以便可以重复这些步骤。另外,如果您的所有消费者都将从同一个队列中提取数据(而不是每个都有一个专用队列),那么这实际上是最小的管理开销。

队列是需要适当管理和控制的东西。否则,您最终可能会遇到流氓消费者声明持久队列,使用它们几分钟,但再也不会。不久之后,您将拥有一个永久增长的队列,并且没有任何东西可以减少其大小,以及即将到来的代理灾难。

关于RabbitMQ:带有主题交换的持久消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6148381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com