何时使用RabbitMQ声明/绑定队列和交换机

18

我们公司有一个包装 RabbitMQ 的库,由一位已经离开的人创建。我正在使用 Rabbit 设计一个新系统,并正在确定声明队列、交换机和绑定的最佳方法。我们的 Rabbit 架构有几个联合全局区域,每个区域都有多个 Rabbit 节点。

发布消息和订阅队列的包装代码每次都会重新声明相关的交换机、队列和绑定。我的担忧是这可能会在每个消息发布时引入显着的延迟,特别是如果它需要等待确认队列/交换机在远程全局区域中存在。我期望每秒数百万条消息的基准测试不会为每个发布重新声明交换机。

简而言之,这种方法对我来说似乎有点浪费和过度警惕,但也许我漏了什么。

因此我有几个问题:

  • 在全局联合的情况下,重新声明队列和交换机是否会对性能产生重大影响?
  • 在每次使用时重新声明是否是一个好方法,因为它可以处理由于代理重启或显式删除导致的队列/交换机消失?
  • 我们应该只在进程开始时声明队列和交换机,并期望它们在整个生命周期内持续存在吗?
  • 耐用交换机和队列应该在 Rabbit 配置中声明,而不是由应用程序声明吗?
  • 如果应用程序可能继续使用旧配置声明队列/交换机,那么如何处理队列/交换机的配置更改?应用程序只需处理声明失败并继续发布/消费吗?
1个回答

19
重新声明队列和交换机会对性能产生显著影响,尤其是在处理大量消息时。
每次使用都重新声明以应对代理重启或显式删除导致的队列/交换机消失的方法并不是一个好方法。它可以有效地防止出现问题,但在大多数情况下并不是一个好选择(如果您很少发送一条消息,可能还可以接受,如果担心拓扑结构被清除)。
应该在进程中声明队列和交换机一次,并希望它们能持续整个生命周期。这种做法存在拓扑被破坏而你不知道的风险,取决于你是否认为这真的会发生。
耐用性队列和交换机应该在Rabbit配置文件中声明,而不是由应用程序声明。预定义的拓扑结构没有问题,但它错过了RabbitMQ和AMQP协议的许多功能和灵活性。如果您处理静态拓扑结构,则这可能是一个不错的选择。
如果应用程序使用旧配置继续声明队列/交换机,如何处理配置更改?应用程序应该崩溃并通过任何错误报告机制进行报告。拓扑结构的更改通常是重要的,并且有其原因。如果交换或队列声明需要更改,则这可能有一个很好的理由,代码不应继续使用旧声明。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接