Skip to content

RabbitMQ Routing

L edited this page Jun 7, 2019 · 3 revisions

简介

Receiving messages selectively
只能订阅一部分消息。 例如,我们只能将关键错误消息定向到日志文件(以节省磁盘空间),同时仍然能够在控制台上打印所有日志消息。 绑定是交换和队列之间的关系。 这可以简单地理解为:队列对来自此交换的消息感兴趣
绑定可以采用额外的routingKey参数。 为了避免与BasicPublish参数混淆,我们将其称为绑定密钥
这就是我们如何使用key创建绑定:

channel.QueueBind(queue: queueName,
                  exchange: "direct_logs",
                  routingKey: "black");

绑定密钥的含义取决于交换类型(exchange type)
我们之前使用的fanout exchanges只是忽略了它的价值

Direct exchange

我们上一个教程中的日志记录系统向所有消费者广播所有消息
我们希望扩展它以允许根据消息的严重性过滤消息
例如,我们可能希望将日志消息写入磁盘的脚本仅接收严重错误,而不是在警告或信息日志消息上浪费磁盘空间
我们使用的是fanout exchanges,它没有给我们太大的灵活性 - 它只能进行无意识的广播
我们将使用direct exchange
直接交换背后的路由算法很简单 - 消息进入队列,其绑定密钥与消息的路由密钥完全匹配
为了说明这一点,请考虑以下设置:
1
在此设置中,我们可以看到直接交换X与两个绑定到它的队列。 第一个队列绑定橙色绑定,第二个绑定有两个绑定,一个绑定密钥为黑色,另一个绑定为绿色
在这样的设置中,使用路由密钥orange发布到交换机的消息将被路由到队列Q1。 路由键为blackgreen的消息将转到Q2。 所有其他消息将被丢弃。

Multiple bindings

2
使用相同的绑定密钥绑定多个队列是完全合法的
在我们的示例中,我们可以在X和Q1之间添加绑定keyblack的绑定
在这种情况下,直接交换将表现得像fanout一样,并将消息广播到所有匹配的队列。 路由键为black的消息将传送到Q1和Q2
3

Clone this wiki locally