在 RabbitMQ 中,消息并不是直接被投递到 Queue(消息队列) 中的,中间还必须经过 Exchange(交换器) 这一层,Exchange(交换器) 会把我们的消息分配到对应的 Queue(消息队列) 中。

共有四种 direct,fanout,topic,headers,其种 headers(几乎和 direct 一样)不实用,可以忽略。
交换器是你的消息到底能投递到哪个消息队列里面去,交换器输入最关键的核心环节.

5.交换器的概念和使用 - 图1

直连Direct 交换器

是一个准确交换,你根据路由键的绑定关系来严格的执行.完全匹配,routing key 完全匹配才行.

路由键完全匹配,消息被投递到对应的队列, direct 交换器是默认交换器。声明一个队列时,会自动绑定到默认交换器,并且以队列名称作为路由键:channel->basic_public($msg,’’,’queue-name’)
5.交换器的概念和使用 - 图2


DirectProducer: direct 类型交换器的生产者
NormalConsumer: 普通的消费者
MulitBindConsumer: 队列绑定到交换器上时,是允许绑定多个路由键的,也就是多重绑定
MulitChannelConsumer: 一个连接下允许有多个信道
MulitConsumerOneQueue: 一个队列多个消费者,则会表现出消息在消费者之间的轮询发送。

生产者和消费者一般用法

案例:ZJJ_RabbitMQ_2019/11/03_13:17:17_fk6sz

代码入门demo:
https://www.yuque.com/docs/share/8d5a201c-5adf-4e3f-8d5b-04998b5d0ae5


队列和交换器的多重绑定

案例:ZJJ_RabbitMQ_2019/11/03_13:17:45_y9y2f


DirectProducer: direct 类型交换器的生产者
NormalConsumer: 普通的消费者
MultiBindConsumer: 队列绑定到交换器上时,是允许绑定多个路由键的,也就是多重绑定
对比:单个绑定的消费者只能收到指定的消息,多重绑定的的消费者可以收到所有的消息
5.交换器的概念和使用 - 图3
代码Demo:

https://www.yuque.com/docs/share/32cd0f4d-6ebc-4e19-bd79-d943c2200c0f?# 《多个路由键的绑定》

一个连接多个信道

案例:ZJJ_RabbitMQ_2019/11/03_13:19:03_2vcj5


DirectProducer: direct 类型交换器的生产者
MultiChannelConsumer: 一个连接下允许有多个信道
一个连接,我们可以使用多线程的方式模拟多个信道进行通讯。这样可以做到多路复用。

Demo:
https://www.yuque.com/docs/share/11615aaa-6cc0-4c14-b8c9-7fb933fe409a?# 《一个连接多个信道》

一个队列多个消费者

案例:ZJJ_RabbitMQ_2019/11/03_13:19:31_krcss


MultiConsumerOneQueue: 一个队列多个消费者,则会表现出消息在消费者之间的轮询发送

5.交换器的概念和使用 - 图4

代码:
https://www.yuque.com/docs/share/f5d6c42c-9d87-4fd0-b9d2-27ee9a1f3bcb?# 《一个队列多个消费者》

Fanout广播交换器


广播交换器,不管你路由键是什么东西,都会往你每一个队列里面发送消息,不管我们如何调整生产者和消费者的路由键,都对消息的接受没有影响,即使路由键写错了,也能接收到消息.

案例:ZJJ_RabbitMQ_2019/11/03_14:35:16_uqcls

fanout广播交换器,类似于群发, 消息广播到绑定的队列,不管队列绑定了什么路由键,只要消息来了,内部会给所以的队列都发一个消息.

5.交换器的概念和使用 - 图5

案例代码:
https://www.yuque.com/docs/share/6c0b749b-439d-47c3-8505-1a87b957d57d?# 《Fanout广播交换器Demo》

Topic交换器

案例:ZJJ_RabbitMQ_2019/11/03_15:23:29_3pk11


Topic交换器用的比较多.

通过使用“”和“#”,使来自不同源头的消息到达同一个队列,”.”将路由键分为了几个标识符,“”匹配 1 个,“#”匹配一个或多个。

假设有交换器 topic_course,
讲课老师有 king,mark,james,
技术专题有 kafka,jvm,redis,
课程章节有 A、B、C,
路由键的规则为 讲课老师+“.”+技术专题+“.”+课程章节,如:king.kafka.A。
与#的区别:
如果我们发送的路由键变成 king.kafka.A
那么队列中如果绑定了 king.
不能匹配
队列中如果绑定了 king.# 能够匹配


king.kafka.1 是不能进入king.*绑定的队列的.
king.kafka.1 可以进入king.#绑定的队列的.#是可以匹配一个和多个的,哪怕你king.kafka.1.2 也可以(比king.kafka.1多一个点)

凡是讲king老师的课程的,会进king.#队列里面来,凡是讲kafka的,就去#.kafka队列里面来,凡是讲jvm的就去#.jvm队列里面来.凡是mark老师讲的课程就去mark.#里面来.

5.交换器的概念和使用 - 图6

第一条消息king,kafka会进king.#队列和#.kafka队列里面来,
第二条消息king.jvm会进king.#队列和#.jvm队列里面去来
第三条消息mark.kafka会进mark.#和#.kafka里面来,
第四条消息mark.jvm会进入mark.#和#.jvm里面来.