RabbitMQ的介绍与学习
一、RabbitMQ的介绍
1.1、什么是RabbitMQ
RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现,官网地址http://www.rabbitmq.com
1.2、什么是AMQP
AMQP就是一个协议,是一个高级抽象层消息通信协议。
虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等联合制定了 AMQP 的公开标准。也就是说AMQP是异步通讯的一个协议。
RabbitMQ是AMQP协议的实现。它主要包括以下组件:

1.3、介绍几个常说的名词
1.Server(broker): 接受客户端连接,实现AMQP消息队列和路由功能的进程。
2.Virtual Host:其实是一个虚拟概念,类似于权限控制组,一个Virtual Host里面可以有若干个Exchange和Queue,但是权限控制的最小粒度是Virtual Host
3.Exchange:接受生产者发送的消息,并根据Binding规则将消息路由给服务器中的队列。ExchangeType决定了Exchange路由消息的行为,例如,在RabbitMQ中,ExchangeType有direct、Fanout和Topic三种,不同类型的Exchange路由的行为是不一样的。
4.Message Queue:消息队列,用于存储还未被消费者消费的消息。
5.Message: 由Header和Body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、由哪个Message Queue接受、优先级是多少等。而Body是真正需要传输的APP数据。
6.Binding:Binding联系了Exchange与Message Queue。Exchange在与多个Message Queue发生Binding后会生成一张路由表,路由表中存储着Message Queue所需消息的限制条件即Binding Key。当Exchange收到Message时会解析其Header得到Routing Key,Exchange根据Routing Key与Exchange Type将Message路由到Message Queue。Binding Key由Consumer在Binding Exchange与Message Queue时指定,而Routing Key由Producer发送Message时指定,两者的匹配方式由Exchange Type决定。 Exchange Type包括三种类型:direct, fanout, topic。

7.Connection:连接,对于RabbitMQ而言,其实就是一个位于客户端和Broker之间的TCP连接。
8.Channel:信道,仅仅创建了客户端到Broker之间的连接后,客户端还是不能发送消息的。需要为每一个Connection创建Channel,AMQP协议规定只有通过Channel才能执行AMQP的命令。一个Connection可以包含多个Channel。之所以需要Channel,是因为TCP连接的建立和释放都是十分昂贵的,如果一个客户端每一个线程都需要与Broker交互,如果每一个线程都建立一个TCP连接,暂且不考虑TCP连接是否浪费,就算操作系统也无法承受每秒建立如此多的TCP连接。RabbitMQ建议客户端线程之间不要共用Channel,至少要保证共用Channel的线程发送消息必须是串行的,但是建议尽量共用Connection。
9.Command:AMQP的命令,客户端通过Command完成与AMQP服务器的交互来实现自身的逻辑。例如在RabbitMQ中,客户端可以通过publish命令发送消息,txSelect开启一个事务,txCommit提交一个事务。
1.4、AMQP的协议栈
在了解了AMQP模型以后,需要简单介绍一下AMQP的协议栈,AMQP协议本身包括三层:

1.Module Layer,位于协议最高层,主要定义了一些供客户端调用的命令,客户端可以利用这些命令实现自己的业务逻辑,例如,客户端可以通过queue.declare声明一个队列,利用consume命令获取一个队列中的消息。
2.Session Layer,主要负责将客户端的命令发送给服务器,在将服务器端的应答返回给客户端,主要为客户端与服务器之间通信提供可靠性、同步机制和错误处理。
3.Transport Layer,主要传输二进制数据流,提供帧的处理、信道复用、错误检测和数据表示。
1.5 参考资料
【1】 http://www.cnblogs.com/luxiaoxun/p/3918054.html
【2】 http://blog.csdn.net/lmj623565791/article/category/2386657
二、RabbitMQ的使用场景
关于RabbitMQ的几种使用场景,这里都是根据官网:
https://www.rabbitmq.com/getstarted.html
来的,具体的代码实现,这里就不粘, 简单总结一下。
2.1 简单模式——单发送单接收
一个生产者、一个消费者,生产者直接将消息发送到队列,消费者消费队列中的消息。

2.2 工人之间分配模式——单发送多接收
一个生产者、多个消费者,生产者将消息直接发送到队列,消费者消费消息。如分布式的任务派发。为了保证消息发送的可靠性,不丢失消息,使消息持久化了。同时为了防止接收端在处理消息时down掉,只有在消息处理完成后才发送ack消息。

注意:在消费者代码里没有这个设置的话channel.basicQos(1),是平均分配, 加上这个设置,就是能者多劳,这种更加符合实际的应用场景;
2.3 订阅模式——Publish/Subscribe
一个生产者、多个消费者,生产者将消息发送到Exchange中,消费者通过路由规则接受消息。有三种类型的Exchanges:direct, fanout,topic。 每个实现了不同的路由算法(routing algorithm)。
· Direct exchange:如果 routing key 匹配, 那么Message就会被传递到相应的queue中。其实在queue创建时,它会自动的以queue的名字作为routing key来绑定那个exchange。发送端按routing key发送消息,不同的接收端按不同的routing key接收消息。

·Fanout exchange: 会向相应的queue广播【没有路由规则】。

发送端:发送消息到一个名为“logs”的exchange上,使用“fanout”方式发送,即广播消息,不需要使用queue,发送端不需要关心谁接收。接收端:声明名为“logs”的exchange的,方式为"fanout",和发送端一样。
·Topic exchange: 对key进行模式匹配,比如ab*可以传递到所有ab*的queue。发送端不只按固定的routing key发送消息,而是按字符串“匹配”发送,接收端同样如此。


浙公网安备 33010602011771号