rabbitmq 什么时候在消息代理中创建队列?

exdqitrt  于 4个月前  发布在  RabbitMQ
关注(0)|答案(1)|浏览(92)

在消息代理中通常在什么时候创建队列?例如,我在应用程序中有一个RabbitMQ,因此我需要在启动它之前创建队列。
我仍然在考虑一种类似于数据库迁移的方法,即创建需要在应用程序之前运行的脚本,但我还没有找到任何辅助工具。

w80xi6nr

w80xi6nr1#

如何在RabbitMQ中创建队列

在RabbitMQ中,在代码中创建队列是一种常见的做法,只是当你需要它们的时候。
我相信大多数客户端库都提供了幂等地创建队列的可能性。例如,当创建队列消费者时,你可能会说,“从这个队列消费,如果它不存在,就创建它。”下面是Java中的一个例子:

Channel channel = connection.createChannel();
channel.queueDeclare("queue name", true, false, false, null); //here is the "create if does not exist" part
channel.queueBind("queue name", "exchange name", "routing");

字符串
根据我的经验,这是一种非常有效的方法来管理RabbitMQ中的队列。
问题是你应该在何时何地创建这个队列。这完全取决于你的需求。基本上有三种方法:

仅消费者创建队列

如果您选择由消费者创建队列,则可以确保当有人需要从队列中消费时,队列就在那里。
缺点是,如果在任何消费者存在之前向该队列生成消息(假设队列是持久的),则消息将丢失。这是否是一个问题取决于您的用例。

消费者和生产者同时创建队列

如果在生产者和消费者端都选择“如果不存在则创建”队列,则可以确保消息永远不会丢失,即使该队列不存在消费者。缺点是队列定义需要在生产者和消费者之间保持一致。例如,如果在生产者中使用相同的名称但不同的参数定义队列(如持久性、参数等),您将以异常结束,因为您不能定义具有相同名称但不同参数的队列。

仅生产者创建队列

我不推荐使用这个选项,但这也取决于你的用例。在这个场景中,你要确保在生成时没有消息丢失,但你需要确保在任何消费者存在之前创建了生产者。否则,你将面临一个异常,因为消费者不能从一个不存在的队列中消费,也不能创建一个队列。
我不推荐的是
我尝试手动管理RabbitMQ队列,借鉴了我在WLS中使用JMS队列的经验,所以这是我的默认想法。然而,我发现这种方法非常繁琐,耗时,并且容易出错。

相关问题