Rabbitmq消息路由机制

本文深入探讨了RabbitMQ消息路由机制,包括交换器、队列、绑定及路由键等核心概念,并通过实例展示了Direct Exchange如何实现消息的精确分发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇博客我们建立了一个简单的日志系统,我们能够广播日志消息给所有你的接收者,如果你不了解,请查看:RabbitMQ (三) 发布/订阅。本篇博客我们准备给日志系统添加新的特性,让日志接收者能够订阅部分消息。例如,我们可以仅仅将致命的错误写入日志文件,然而仍然在控制面板上打印出所有的其他类型的日志消息。

RabbitMQ是一个开源的消息中间件,它实现了AMQP(高级消息队列协议)并提供了灵活的消息路由机制。消息路由机制是RabbitMQ用来将消息从生产者传递给消费者的重要机制。在RabbitMQ中,消息通过交换器(Exchange)进行路由和分发。以下是RabbitMQ消息路由机制的详细解释:

交换器(Exchange):
交换器是消息路由的关键组件。生产者将消息发送到交换器,然后交换器根据预定义的规则将消息路由到一个或多个消息队列中。RabbitMQ支持不同类型的交换器,主要有以下几种类型:

Direct Exchange(直连交换器):将消息路由到与消息携带的Routing Key完全匹配的队列。
Fanout Exchange(扇形交换器):将消息路由到所有与该交换器绑定的队列。
Topic Exchange(主题交换器):将消息路由到与消息携带的Routing Key模式匹配的队列。
Headers Exchange(头交换器):根据消息头中的键值对进行匹配,而不是路由键。
队列(Queue):
队列是消息的终点,消费者从队列中接收消息并进行处理。在RabbitMQ中,消息队列是存储消息的地方,直到它们被消费者消费为止。每个队列都绑定到一个或多个交换器,并使用绑定的Routing Key来接收特定类型的消息。

绑定(Binding):
绑定是交换器和队列之间的关联关系。通过绑定,交换器知道将消息传递到哪些队列。绑定是根据Routing Key来进行匹配的,不同类型的交换器对Routing Key的匹配规则有所不同。

Routing Key:
Routing Key是生产者发送消息时附带的关键信息。交换器根据Routing Key来决定将消息路由到哪个队列。在Direct Exchange中,Routing Key需要与队列的绑定Routing Key完全匹配;在Topic Exchange中,Routing Key可以使用通配符匹配。

Exchange类型和Routing Key的匹配规则:

Direct Exchange:完全匹配,Routing Key和队列的绑定Routing Key必须完全相同。
Fanout Exchange:忽略Routing Key,将消息广播到所有绑定的队列。
Topic Exchange:使用通配符匹配,可以使用*匹配一个单词,使用#匹配多个单词。
总结:RabbitMQ的消息路由机制是通过交换器将消息从生产者传递到消费者的重要机制。交换器根据预定义的规则将消息路由到一个或多个队列中,消费者从队列中接收并处理消息。不同类型的交换器和Routing Key的匹配规则使得RabbitMQ能够实现灵活而强大的消息路由功能。
 

1、绑定(Bindings)

在上一篇博客中我们已经使用过绑定。类似下面的代码:
channel.queueBind(queueName, EXCHANGE_NAME, "");
绑定表示转发器与队列之间的关系。我们也可以简单的认为:队列对该转发器上的消息感兴趣。
绑定可以附带一个额外的参数routingKey。为了与避免basicPublish方法(发布消息的方法)的参数混淆,我们准备把它称作绑定键(binding key)。下面展示如何使用绑定键(binding key)来创建一个绑定:
channel.queueBind(queueName, EXCHANGE_NAME, "black");
绑定键的意义依赖于转发器的类型。对于fanout类型,忽略此参数。

2、直接转发(Direct exchange)

上一篇的日志系统广播所有的消息给所有的消费者。我们希望可以对其扩展,来允许根据日志的严重性进行过滤日志。例如:我们可能希望把致命类型的错误写入硬盘,而不把硬盘空间浪费在警告或者消息类型的日志上。
之前我们使用fanout类型的转发器,但是并没有给我们带来更多的灵活性:仅仅可以愚蠢的转发。
我们将会使用direct类型的转发器进行替代。direct类型的转发器背后的路由转发算法很简单:消息会被推送至绑定键(binding key)和消息发布附带的选择键(routing key)完全匹配的队列。
图解:

上图,我们可以看到direct类型的转发器与两个队列绑定。第一个队列与绑定键orange绑定,第二个队列与转发器间有两个绑定,一个与绑定键black绑定,另一个与green绑定键绑定。
这样的话,当一个消息附带一个选择键(routing key) orange发布至转发器将会被导向到队列Q1。消息附带一个选择键(routing key)black或者green将会被导向到Q2.所有的其他的消息将会被丢弃。

3、多重绑定(multiple bindings)

使用一个绑定键(binding key)绑定多个队列是完全合法的。如上图,一个附带选择键(routing key)的消息将会被转发到Q1和Q2。

4、发送日志(Emittinglogs)

我们准备将这种模式用于我们的日志系统。我们将消息发送到direct类型的转发器而不是fanout类型。我们将把日志的严重性作为选择键(routing key)。这样的话,接收程序可以根据严重性来选择接收。我们首先关注发送日志的代码:

像以前一样,我们需要先创建一个转发器:

channel.exchangeDeclare(EXCHANGE_NAME,"direct");

然后我们准备发送一条消息:

channel.basicPublish(EXCHANGE_NAME,severity, null, message.getBytes());

为了简化代码,我们假定‘severity’是‘info’,‘warning’,‘error’中的一个。

5、订阅

接收消息的代码和前面的博客的中类似,只有一点不同:我们给我们所感兴趣的严重性类型的日志创建一个绑定。

StringqueueName = channel.queueDeclare().getQueue();

for(Stringseverity : argv)

{

channel.queueBind(queueName, EXCHANGE_NAME, severity);

}

6、完整的实例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值