AMQP协议机制

RabbitMQ中的消息的概念:

Message:消息,消息是不具体的,它由消息头和消息体来组成。消息体是不透明的,而消息头则是由一系列的可选属性组成,这些属性包括Routing-Key(路由键)、Priority(相对于其他的优先权)、Delivery-mode(指出消息可能需要持久化存储)等

rabbit mq 广播消息Java rabbitmq消息机制_队列

1、Publisher:消息的生成者,也是先交换机发布消息的客户端程序。

2、Exchange:交换机,用来接受消息生成者发送的消息并将这些消息路由(即转发)个体服务器中的队列

3、Binding:绑定,用于消息队列和交换机之间的关联。一个绑定就是基于路由键(Ruting-Key)将交换器和消息队列连接起来的路由规则,所以可以将交换机理解成一个由绑定构成的路由表。

4、Queue:消息队列,用来保存消息知道发送到消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或者多个队列。消息一直在消息队列里,等待消费者连接到这个队列来获取消息。

5、Channel:信道,多路复用连接中的一条独立的双向数据流通道。可以理解为双向通道。

6、Virtual Host:虚拟主机,表示一批交换机、消息队列和相关对象

AMQP中的消息路由

生产者把消息发布到Exchange上,消息最终到达队列并被消费者接受,而且Binding决定交换机的消息应该发送到哪个队列中

rabbit mq 广播消息Java rabbitmq消息机制_队列_02

Exchange类型

Exchange分发消息是根据类型的不同分发策略有所区别,目前分为四种类型,direct、fanout、topic、headers。匹配AMQP消息的header而不是路由键,此外header交换机和direct交换机完全一致,但性能差很多目前几乎用不到,所以这里不介绍了。

Diret交换机

消息中的路由键(Routing Key)如果和Binding中的Binding Key一致,交换机就将消息发到对应的队列中。路由键和队列名完全匹配。它是完全匹配、单播模式。

rabbit mq 广播消息Java rabbitmq消息机制_rabbit mq 广播消息Java_03

当消息头中的RoutingKey和队列中的BindingKey完全一致的时候,Exchange就会将消息发送到该队列中,而图中的Binding就是绑定规则,消息的消费者有多个,不同的消费者监听不同的队列。

Fanout交换机

Fanout交换机原理有点像广播的原理一样,每个发到Fanout类型的交换机的消息都会分到所有绑定的队列中。Fanout交换机不处理路由键,只是简单的将队列绑定到交换机上。

每个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。

rabbit mq 广播消息Java rabbitmq消息机制_消息路由_04

这种交换机是一种广播模式,该模式中每有RoutingKey和BindingKey的概念。这种模式可能会导致消息的丢失,就类似于你收听的广播,当你错过了该消息就永远错过该条消息了。

适用于消息数据不是很重要的场景中。如手机App的消息推送。

虽然会丢失消息但该类型的交换机是速度最快的。

Topic交换机

Topic交换机通过模式匹配分配消息路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,每个单词之间用点隔开。

该模式只识别两个通配符:符号"#“和符号”*"。#匹配0个或者多个单词。"*"匹配一个单词。

案例1

rabbit mq 广播消息Java rabbitmq消息机制_rabbitmq_05

由于星号"*"就匹配一个单词,所以消息会分配到队列1和队列3中。

案例2

rabbit mq 广播消息Java rabbitmq消息机制_rabbitmq_06

案例3

rabbit mq 广播消息Java rabbitmq消息机制_rabbitmq_07

由于该消息的RoutingKey没有匹配到任何一个BindingKey,所以不会进入到任何一个队列中。该类型的交互机也会丢失消息。