RabbitMQ简介
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
基础概念
Quene
Queue(队列)是RabbitMQ的内部对象,用于存储消息,生产者生产消息发送到队列中,消费者订阅消息后就可以从队列中获取消息
同一个队列Queue也可以被多个消费者订阅,这时队列中的消息会被平均分摊(轮询)给多个消费者进行消费,而不是每个消费者都收到所有的消息进行消费,prefetchCount可以限制每次发送给消费者消息的个数,这里的prefetchCount=1是指每次从Queue中发送一条消息后,等消费者处理完这条消息后Queue会再发送一条消息给消费者
Exchange
在rabbitmq中生产者生产的消息并不是直接发送到队列上的,而是要经过Exchange,由Exchange将消息路由到一个或多个Queue,如果路由规则不匹配,那么消息也会被废弃掉,当队列想要收到交换机发来的消息时,需要队列与交换机建立binding,通常建立绑定关系时都会指定一个BindingKey,生产者将消息发送给交换器的时候,一般也会指定一个RoutingKey,用来指定这个消息的路由规则,当BindingKey和RoutingKey匹配上时,消息就会发送到相应的队列上
Exchange Type
根据不同的路由策略,Exchange主要分为四种类型
一、fanout
广播交换机(fanout)的路由规则非常简单,只要是绑定到广播交换机上的队列都会接收到消息,不会匹配路由RoutingKey
二、direct
定向交换机(direct)的路由规则则是会把消息路由到RoutingKey与BindingKey完全匹配的队列中,下图中当发送消息时指定Routingkey为flower时,那么消息就会路由到queue1队列中去,指定Routingkey为book或者water时消息就会路由到queue2中去,rabbimq中每个队列建立后都会默认绑定到一个类型为direct的default exchange,BindingKey为队列名称
三、topic
适配符交换机(topic)的路由规则与定向交换机类似,定向交换机(direct)需要严格匹配时才能将消息发送到相应的队列,topic的路由规则就是模糊匹配,只要通配符满足规则就可以发送,发送消息时binding key应为句点号“. ”分隔的字符串,binding key中可以存在两种特殊字符“*”与“#”,用于做模糊匹配,其中“*”用于匹配一个单词,“#”用于匹配0个或多个单词,同时routing key也为一个句点号“. ”分隔的字符串
上图中,routingKey=”awe.flower.rabbit”的消息会路由到Queue1,routingKey=”awe.flower.book”的消息会路由到Queue1和Queue2,routingKey=”awe.some.book”的消息会路由到Queue2,routingKey=”water.some.awe”的消息会路由到Queue2(只会投递给Queue2一次,虽然这个routingKey与Queue2的两个bindingKey都匹配)
四、headers
headers交换机不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配,绑定队列到交换机上时指定指定一组键值对,当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对,如果完全匹配则消息会路由到该Queue,否则不会路由到该Queue。
Connections
AMQP是一种使用TCP进行可靠传输的应用程序级协议。 AMQP连接可以使用身份验证,并且可以使用TLS(SSL)进行保护。 当应用程序不再需要连接到AMQP代理时,它应该正常关闭AMQP连接,而不是突然关闭底层TCP连接。
Channels
特定通道上的通信与另一个通道上的通信完全分离,因此每个AMQP方法都会携带一个通道号,客户端可以使用该通道号来确定该方法适用于哪个通道