AMQP
AMQP,即 Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
RabbitMQ 是一个开源的 AMQP 实现。
消息路由过程
与 ActiveMQ 拿到消息就直接放在队列等待消费者拿走不同, Rabbit 拿到消息之后,会先交给 交换机 (Exchange), 然后交换机再根据预先设定的不同绑定( Bindings )策略,来确定要发给哪个队列。
如图所示,比起 ActiveMQ 多了 Exchange 和 Bindings。
正式由于有了 Exchange 和 Bindings, RabbitMQ 就可以灵活地支撑各种模式。
交换机有四种模式:Direct, topic, Headers and Fanout
.Direct:direct 类型的行为是”先匹配, 再投送”. 即在绑定时设定一个 routing_key, 消息的routing_key 匹配时, 才会被交换器投送到绑定的队列中去.
.Topic:按规则转发消息(最灵活)
.Headers:设置 header attribute 参数类型的交换机
.Fanout:转发消息到所有绑定队列
比较常用的是Direct、Topic、Fanout.
Fanout
这种Fanout模式不处理路由键,只·需要简单的将队列绑定到exchange上,一个发送到exchange的消息都会被转发到与该exchange绑定的所有队列上。很像广播子网,每台子网内的主机都获得了一份复制的消息。Fanout类型的Exchange转发消息是最快的。
简单说,就是广播模式,消息来了,会发送给所有队列。
Direct
这种模式会处理路由键,也就是所谓的按需索取。需要将一个队列绑定到exchange上面,要求该消息与一个特定的路由键完全匹配。消息才会进入到该队列中。如果一个队列绑定到该交换机上要求路由键 “dog”,则只有被标记为“dog”的消息才被转发,不会转发dog.puppy,也不会转发dog.guard,只会转发dog。
简单说,就是指定队列模式, 消息来了,只发给指定的 Queue, 其他Queue 都收不到。
Topic
这种模式和Direct模式的原理是一样的,都是根据路由键进行消息的路由,但是这种支持路由键的模糊匹配,此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。
参考:
【1】、https://blog.csdn.net/hao134838/article/details/71710067
【2】、http://how2j.cn/k/message/message-rabbitmq-type/2031.html
【3】、http://www.ityouknow.com/springboot/2016/11/30/spring-boot-rabbitMQ.html