RabbitMQ是如何实现消息路由的?

开发 前端
生产者把消息发送到 RabbitMQ Broker 上的Exchange 交换机上。Exchange 交换机把收到的消息根据路由规则发给绑定的队列(Queue)。最后再把消息投递给订阅了这个队列的消费者,从而完成消息的异步通讯。

​1.工作流程

RabbitMQ 是一个基于 AMQP 协议实现的分布式消息中间件。AMQP 的具体工作机制是,

图片

生产者把消息发送到 RabbitMQ Broker 上的Exchange 交换机上。Exchange 交换机把收到的消息根据路由规则发给绑定的队列(Queue)。最后再把消息投递给订阅了这个队列的消费者,从而完成消息的异步通讯。

其中,Exchange交换机,可以定义消息的路由规则,将消息路由到指定的队列。然后 Queue队列是消息的载体,每个消息可以根据路由规则路由到一个或者多个队列中。

2.路由策略

完成RabbitMQ消息路由的核心组件是 Exchange。而消息的路由是由Exchange类型 和 Binding 来决定的。Binding 表示建立 Queue 和 Exchange 之间的绑定关系,每一个绑定关系会存在一个 BindingKey。

通过这种方式相当于在 Exchange 中建立了一个路由关系表。生产者发送消息的时候,需要声明一个 RoutingKey(路由键),Exchange 拿到RoutingKey 之后,根据 RoutingKey 和路由表里面的 BindingKey 进行匹配,而匹配的规则是通过 Exchange类型来决定的。

在 RabbitMQ 中,默认有四种类型的 Exchange:Direct ,Fanout、Topic和Header。

Direct,叫直连,也就是完整匹配方式,需要Routing Key 和 Binding Key 完全一致,相当于点对点的发送。如图所示:

图片

如果发送routing key为”spring”的消息,那么只有第一个队列能收到消息。

Topic:叫主题,这种方式是通过设置通配符来动态匹配,相当于正则。就是用Routing Key 去匹配Binging Key。BingingKey支持两个通配符。

代表匹配0个或者多个单词

* 代表匹配不多不少一个单词

另外,BingingKey用点隔开两个单词。

用*表示使用正则表达式进行匹配,如图所示:

图片

有4个队列绑定到Topic类型的交换机,而且使用不同的绑定键。

如果发送routing key为"junior.abc.jvm" 的消息,那么,只有第一个队列能收到。

如果发送routing key为"senior.netty"的消息,那么,第二个队列和第三个队列能收到。

Fanout:叫广播,这种方式不需要设置Routing Key,而是把消息广播给绑定到当前 Exchange 上的所有队列上。如图所示:

图片

只要发送消息到Fanout Exchange上,那么三个队列都能收到消息

RabbitMQ、Kafka、RocketMQ 是目前最主流的分布式消息中间件。有的同学可能对 Kafka 比较了解,有的同学可能对 RabbitMQ 比较了解。不过,在面试的时候,面试官一般会问你用过的技术组件。通过面试过程中推演出你的学习能力以及对技术的掌握能力,这个方面如果还不错的话,接触一个新的 MQ 组件所消耗的学习成本会比较小。

责任编辑:武晓燕 来源: Tom弹架构
相关推荐

2022-07-26 20:00:35

场景RabbitMQMQ

2020-09-27 07:44:08

RabbitMQ投递消息

2020-10-14 08:36:10

RabbitMQ消息

2024-05-23 12:11:39

2024-05-09 08:04:23

RabbitMQ消息可靠性

2023-09-05 15:48:14

RabbitMQ延迟队列

2024-05-16 08:10:17

RabbitMQ软件通信机制

2024-05-10 09:36:36

架构消息队列

2020-08-26 07:17:19

通信

2023-12-04 09:23:49

分布式消息

2021-09-07 10:38:37

RabbitMQ 高可用消费

2019-02-25 15:44:16

开源RabbitMQSpring Clou

2024-01-31 09:42:11

RabbitMQ消息队列.NET

2023-11-08 07:51:11

RabbitMQ接收消息

2024-03-22 12:10:39

Redis消息队列数据库

2024-01-26 13:16:00

RabbitMQ延迟队列docker

2021-09-17 12:50:10

MySQL数据库ACID

2023-09-08 10:02:14

Linux系统

2024-04-03 11:36:09

KafkaRabbitMQ架构

2024-11-05 15:02:41

点赞
收藏

51CTO技术栈公众号