RabbitMq学习 Exchange的四种类型和属性
Posted zhazhahui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMq学习 Exchange的四种类型和属性相关的知识,希望对你有一定的参考价值。
一、什么是Exchange
首先我们要了解到,RabbitMQ 是 AMQP(高级消息队列协议)的标准实现:
从 AMQP 协议可以看出,Queue、Exchange 和 Binding 构成了 AMQP 协议的核心
-
Producer:消息生产者,即投递消息的程序。
-
Broker:消息队列服务器实体。
-
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
-
Binding:绑定,它的作用就是把 Exchange 和 Queue 按照路由规则绑定起来。
-
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
-
-
Consumer:消息消费者,即接受消息的程序。
二、Exchange的作用
Exchange的主要作用还是为了解耦。
AMQP 协议中的核心思想就是生产者和消费者的解耦,生产者不直接将消息投递给队列,而是将消息投递给Exchange,然后Exchange根据相应的路由规则投递给队列,最后队列将消息投递到消费者。
举个生活中的例子,不是很恰当,但大概意思就是这样。将报纸、投递站、投递员、订阅报纸的用户分别看做生产者、exchange、队列以及消费者。
报纸印刷后,会分发到投递站,投递站相当于exchange,会指定分发规则,例如,这一片区的报纸分给某个投递员,投递员拿到这些报纸后,对订阅了该报纸的这一片区的用户进行投递。
当然这个队则有多种,例如将区域看做一个规则、将报纸种类看做规则、或者区域加种类混合规则。下面就详细介绍exchange的类型。
三、Exchange的类型
3.1 Fanout Exchange
这是最简单的一种交换器,首先要知道一个概念-banding。banding是将exchange和队列绑定的一种队则,java中万物皆对象,所以这个绑定也看做一个对象。
banding中还有个路由键的概念。就是即使交换机与队列进行了绑定,但是在某些场景下,我们不希望与交换机绑定的队列都能收到消息。所以就可以去指定一个路由键。
在进行绑定的时候去指定路由键,在发送消息的时候指定Exchange、指定路由键,才可以正确的将消息发送到队列上。
Fanout Exchange 比较特殊 会忽略路由键的设置,直接将 Message 广播到所有绑定的 Queue 中。
3.2 Direct Exchange
Direct Exchange 是RabbitMq的模式模式,将Exchange和队列绑定的时候,需要指定路由键,并且在发消息的时候也需要指定路由键,并且路由键必须要完全一致。
例如指定了路由键是green,那么只有与exchange绑定并且路由键为green的队列才会收到消息。
3.3 Topic Exchange
与Direct Exchange基本相同,唯一区别在于路由键。Topic exchange 的路由键可以去进行模糊匹配。
* 表示一个单词的模糊匹配 例如,路由键是 *.apple.big 则表示第一个单词可以是任意的,只要后边单词完全匹配,就可以。
# 表示完全模糊匹配。例如 路由键是 #.little ,那么 发送消息的路由键可以是 green,apple,little,也就是说前面的单词是任意的。
四、Exchange的使用
多说无益,直接撸代码。
就用topic 做演示,其他的模式基本一样。
1. 首先设定一个路由键
public static final String TOPIC_C = "red.*.*";
2.配置一个topicExchange
@Bean public TopicExchange topicExchange() return new TopicExchange(EXCHANGE_C);
3. 配置一个队列
第一个参数拜师队列名称,第二个参数表示是否持久化
@Bean public Queue queueC() return new Queue(QUEUE_C, false); //队列持久
4. 配置bangding
@Bean public Binding bindingC() return BindingBuilder.bind(queueC()).to(topicExchange()).with(TOPIS_C);
5. 发送消息代码
第一个参数是Exchange名称,第二个参数是路由键,第三个参数是内容,第四个参数是唯一性id
如果是 Fanout Exchange 那么就不用指定路由键传参为null,
如果是 Direct Exchange,那么路由键就要与指定的路由键完全匹配。
public void sendMsg(String content) CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend(EXCHANGE_C, "red.cc.dd", content, correlationId);
这样路由键是 red.*.* ,发送消息的路由键是 "red.cc.dd" ,并且因为是Topic Exchange模式,所以该路由键是可以匹配到的。
完整代码请参考:https://github.com/zhuanzhiBUG/springboot-rabbitmq.git
部分参考内容:https://blog.csdn.net/y4x5M0nivSrJaY3X92c/article/details/80416996
以上是关于RabbitMq学习 Exchange的四种类型和属性的主要内容,如果未能解决你的问题,请参考以下文章