AMQP的全称为Advanced Message Queuing Protocl,即高级消息队列协议,它是应用层协议的一个开放标准,为面向消息的中间件而设计.该协议主要用于制定基于队列进行消息传递的开放标准.
消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然.AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全.
由于RabbitMQ是基于AMQP协议实现的,故在RabbitMQ的实现当中也是围绕对这些概念进行内部功能组件的设计,并将这些组件整合起来提供一个完整的消息队列服务.
AMQP协议规定,AMQP消息必须有三部分构成: 交换机,队列和绑定. 生产者把消息发送到交换机,交换机与队列的绑定关系决定了消息如何路由到特定的队列,最终被消费者接收.
消息是不能直接到达队列(Queue)的.
在AMQP协议中,消息实际上是被投递到交换机,然后具体路由到哪个队列由交换机根据路由键(routing key)完成.
当你发消息到代理服务器时,即便路由键是空的,RabbitMQ也会将其和使用的路由键进行匹配.如果路由的消息不匹配任何绑定模式,消息将会被丢弃.
交换机在队列与消息中间起到了中间层的作用,有了交换机我们可以实现更灵活的功能,RabbitMQ中有三种常用的交换机类型.
可以理解direct为1v1,fanout为1v所有,topic可以1v任意.
AMQP 中消息的路由过程和 Java 开发者熟悉的 JMS 存在一些差别,AMQP 中增加了 Exchange 和 Binding 的角色.生产者把消息发布到 Exchange 上,消息最终到达队列并被消费者接收,而 Binding 决定交换器的消息应该发送到那个队列.
Exchange分发消息时根据类型的不同分发策略有区别,目前共四种类型:direct、fanout、topic、headers
. headers 匹配 AMQP 消息的 header 而不是路由键,headers 交换器和 direct 交换器完全一致,但性能差很多,目前几乎用不到了,所以常用的是另外三种类型.
1️⃣. direct类型
消息中的路由键(routing key)如果和 Binding 中的 binding key 一致,交换器就将消息发到对应的队列中,路由键与队列名完全匹配.如果一个队列绑定到的交换机要求路由键为“dog”,则只转发 routing key 标记为“dog”的消息,不会转发“dog.puppy”,也不会转发“dog.guard”等.它是完全匹配、单播的模式.
2️⃣. fanout类型
每个发到 fanout 类型交换器的消息都会分到所有绑定的队列上去.fanout 交换器不关心路由键,只是简单的将队列绑定到交换器上,每个发送到交换器的消息都会被转发到与该交换器绑定的所有队列上.很像子网广播,每台子网内的主机都获得了一份复制的消息.fanout 类型转发消息是最快的.
3️⃣. topic类型
topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上.它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开.它会识别两个通配符: #
和*
,#
匹配0个或多个单词,*
匹配一个单词.