rabbitMQ
概述:
开源的消息中间件,支持AMQP协议(Advanced Message Queue Protocol )设计。具有较高的可用性、扩展性和易用性。由Erlang语言开发。
主要特点:
可靠性:RabbitMQ使用一些机制保证可靠性,如持久化、传输确认、发布确认。
灵活路由:在消息进入队列之前通过Exchange路由消息。对于典型的路由功能,RabbitMQ已经提供一些内置的Exchange实现。对于更加复杂的路由功能,可以将多个Exchange绑定一起,也可以插件机制来实现Exchange。
消息集群:多个RabbitMQ服务器可以组成一个集群。
高可用:队列可以在集群上镜像,使得部分节点出现问题的情况下仍可用。
多种协议:支持MQTT、STOMP协议。
多语言:支持所有的语言,java、.net。
跟踪机制:如果出现异常,RabbitMQ提供消息跟踪机制,使用者可以找出来发生了什么。
架构模型
Message
消息,消息是没有消息名的是由消息头和消息体组成。消息体是不透明的,消息头则是由一系列的可选属性构成,属性包括路由键(routing-key), 消息优先级(priority)、是否进行持久化存储(delivery-mode )。
Publisher
消息生产者、 也是一个向交换器发布消息的客户端应用程序。
Exchange
交换器、用来接收生者发送的消息,并把消息路由到服务器中的队列。
Bingding
绑定,交换器和消息队列之间的关联。 一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
Queue
队列,是RabbitMQ的内部对象,用于存储消息的消息容器。一个消息可以投递多个队列,消息一直在队列里面,等待消费者消费将其取走。
Connectioin
网络连接TCP连接。
Channel
信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,AMQP就是通过信道发送出去。不管是发布消息、订阅消息还是接收消息,这些动作都是通过信道完成的。
因为对于操作系统TCP的创建、连接和销毁都是非常昂贵的开销。
信道的概念可以复用TCP连接。减少开销、节约资源。
Consumer
消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。
Virtual Host
虚拟主机,表示一系列,交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。
Broker
表示消息队列服务器实体。
Exchange类型:
Exchange分发消息的时候根据消息的类型不同,分发策略也是有区别的。目前常见的有,direct、topic、fanout、headers。
Headers:匹配AMQP的消息,header而不是路由键,此外header交换器和direct交换器一致但是性能相差很多,目前几乎用不到。
Direct:
消息中的routing-key如果Bingding中的bingding key一致,交换器则把消息发送到对应的队列中。它是完全匹配、单播的模式。
例如:
我们以routingKey="error"发送消息到 Exchange。
则消息会路由到 Queue1(amqp.gen-S9b…,这是由RabbitMQ自动生成的Queue名称)和 Queue2(amqp.gen-Agl…)。
如果我们以 routingKey=”info”或routingKey=”warning” 来发送消息,则消息只会路由到 Queue2。如果我们以其他 routingKey 发送消息,则消息不会路由到这两个 Queue 中。
Fanout:
Fanout:每个发到fanout类型交换器的消息都会分到所有绑定的队列上去。类似子网传播、每台子网内的主机都获得一份复制的消息。fanout模式下消息分发速度最快。
生产者 Publisher 发送到 Exchange 的所有消息都会路由到图中的两个 Queue
,并最终被两个消费者(Consumer1与Comsumer2)消费。
Topic交换器
topic交换器:topic交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键routing-key和绑定的字符串切分为单词。这些单词之间用点隔开, 它同样也会识别两个通配符:符号 “#
” 和符号 “” 。# 匹配 0
个或多个单词,匹配不多不少一个单词。
routingKey="quick.orange.rabbit" 的消息会同时路由到Q1与Q2。
routingKey="lazy.orange.fox" 的消息会路由到Q1
routingKey="lazy.brown.fox" 的消息会路由到Q2
routingKey=”lazy.pink.rabbit” 的消息会路由到Q2(只会投递给Q2一次,虽然这个 routingKey 与Q2的两个 bindingKey 都匹配)。
routingKey=”quick.brown.fox”、
routingKey=”orange”、
routingKey=”quick.orange.male.rabbit”
的消息将会被丢弃,因为它们没有匹配任何 bindingKey 。