何时使用 RabbitMQ declare/bind 队列和交换

When to declare/bind Queues and Exchanges with RabbitMQ

我们在我的工作场所有一个围绕 RabbitMQ 的包装器库,它是由不再在这里工作的人创建的。我正在使用 Rabbit 设计一个新系统,并且正在研究声明队列、交换和绑定的最佳方法。我们的 Rabbit 架构有几个联合的全局区域,每个区域都有多个 Rabbit 节点。

发布消息和订阅队列的包装代码每次都重新声明相关的交换器、队列和绑定。我担心的是,这可能会给每条消息发布带来明显的延迟,特别是如果它需要等待确认 queue/exchange 存在于远程全局区域中。我希望每秒数百万条消息的基准不会为每次发布重新声明交换。

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

所以我有几个问题:

Is re-declaring the queues and exchanges a significant performance hit

它可以用于非常大量的消息

Is re-declaring on each use a good approach because it handles queues/exchanges disappearing due to broker restarts or explicit deletion?

"good approach" - 没有。

"effective" 防止消失的交换/队列/绑定引起问题,是的......但在大多数情况下这不是一件好事

(如果您只是很少发送消息,也许没问题,担心拓扑被清除是一个真正的原因)

Should we just declare queues and exchanges once per process and expect them to last the whole lifetime?

这是我的一般做法。

它打开了拓扑被破坏的可能性,而你却不知道。归结为您是否认为这真的会发生。

Should durable exchanges and queues be declared in Rabbit config and not declared by the applications at all?

预定义拓扑没有任何问题,但它错过了 rabbitmq 和 amqp 协议的许多功能和灵活性。

许多邮件系统需要预定义的拓扑和专门的工具来管理拓扑。 amqp 的不同之处在于它允许您根据需要定义拓扑。

如果您处理静态拓扑,那么这对您来说可能是个不错的选择

How should config changes for queues/exchanges be handled if applications may continue to declare them with old config? Should applications just handle the declare failure and continue to publish/consume?

我会崩溃应用程序并通过您正在使用的任何错误报告机制报告它。

更改拓扑结构通常很重要,而且这样做是有原因的。如果交换器或队列声明需要更改,可能有充分的理由,代码不应继续使用旧声明。