Rabbitmq:exchange->routingkey->queue命名结构

Posted

技术标签:

【中文标题】Rabbitmq:exchange->routingkey->queue命名结构【英文标题】:Rabbitmq: exchange->routingkey->queue naming structure 【发布时间】:2014-07-12 15:23:10 【问题描述】:

我正在使用直接交换,因为我希望将一份工作分配给一位消费者。

有不同的消费者群体会消费不同的工作。可以说我的应用程序称为“foo”。然后我有工作

bar1 bar2 bar3....

将有一组单独的消费者处理“bar1”作业,然后是另一组消费者处理“bar2”等

我试图找出任何特定的命名/路由结构是否有好处,但没有找到任何指向一种或另一种方式的东西

问题 1) 我应该使用多个交换名称吗 交流:

exc_bar1 exc_bar2 exc_bar3

或者单次交换最好 交流:

exc_foo

然后使用路由键发送到正确的消费者队列 路由键

rk_bar1 rk_bar2 rk_bar3

无论哪种方式我都无法找到任何东西,所以我认为这并不重要,但最好是问一下,以防万一我错过了一些东西并且它确实很重要。


背景信息

以防万一它是相关的

producer是一个python webapp,使用rabbitpy库 消费者是使用默认rabbitmq客户端库的c#应用程序

生产者可以设置 * 交易所名称 * 路由键名

消费者可以设置 * 交易所名称 * 路由键名 * 队列名称

【问题讨论】:

【参考方案1】:

对于这种情况,我建议使用单个 exchange 来包含单个应用程序的所有作业,然后使用 queue 来表示每个作业类型,这然后可以有多个消费者(然后能够以循环方式处理来自该队列的消息)。

路由键然后可用于指导消费者他们正在处理哪个工作

只有一个交换既可以作为逻辑分组(即在应用程序级别),又可以简化 RabbitMQ 内的管理/管理/监控。如果您有新的作业类型,您只需创建一个新的队列和绑定并更改路由键,而不是必须创建一个新的交换然后还必须创建一个新的队列和绑定。

如果以后你有一个完全不同的应用程序,那么我会说是时候为它创建一个新的 exchange 然后遵循我上面提到的相同的一般模型(假设它从高级别)。

我认为 RabbitMQ 网站上的 Routing tutorial 可能最适合您的情况,如果您正在寻找更多详细信息(以下链接适用于 Python,但它们C# 也有一个)。

【讨论】:

以上是关于Rabbitmq:exchange->routingkey->queue命名结构的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较

RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较

RabbitMQ工作模式 - 路由模式(Direct 模式) --- 2022-04-03

RabbitMQ headers Exchange

RabbitMQ高级特性

rabbitmq使用dead letter机制来进行retry