基于异步消息处理的RabbitMQ运行原理探讨
2017-11-30骆文亮四川职业技术学院
骆文亮 四川职业技术学院
基于异步消息处理的RabbitMQ运行原理探讨
骆文亮 四川职业技术学院
对于一个大型的软件系统来说,不同的模块分布在不同的服务器上,模块之间的通信如果采用传统的同步消息传输机制来传输的话会导致很多问题(如连接的维持、通信的可靠性、消息的过滤等等)。本文主要分析了基于消息异步处理的RabbitMQ的几种不同的消息分发机制,并说明了这些方式的主要应用场景。
RabbitMQ 消息异步处理
1 引言
在较为大型的商业软件开发中,常常会遇到下面这些问题:①多个模块间需要通过定时任务来同步某些数据;②异构系统的不同进程间相互调用、通讯;③各个系统(模块)之间的负载均衡;④消息的优先级的定义等等问题。本文主要分析了能够解决以上问题的基于消息的异步处理的一种实现——RabbitMQ的消息分发机制。
2 RabbitMQ介绍
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
3 RabbitMQ分析
3.1 RabbitMQ运行机制
如图3-1所示,RabbitMQ的运行需要三个“部件”:①RabbitMQ服务器(RabbitMQ Server);②消息发送者(ClientA、ClientB);③消息的消费者(Client1、Client2、Client3)。这三者相互合作、缺一不可。下面分别对着三者进行详细介绍:
RabbitMQ Server:RabbitMQ服务器,主要功能就是维护一条从“消息发送者”到“消息消费者”的路线,保证数据能够按照指定的方式进行传输。
Client A amp; B:数据的发送方。数据通过交换机(Exchange)路由到相应的队列(Queue)上。
Client 1,2,3:数据的接收方。当发送方把数据路由到队列(Queue)上以后,由RabbitMQ服务器把队列上的数据分发给相应的接收方。
图3-1 RabbitMQ运行机制
在默认情况下,如果消息已经被某个“消息消费者”正确的接收到后,那么该消息就会被从队列中移除。
如果一个队列没被任何的“消息消费者”(订阅),那么如果这个队列有数据到达,那么这个数据会被缓存,不会被丢弃。当有“消息消费者”时,这个数据会被立即发送给它,这个数据接受完成时就会从队列中删除。
RabbitMQ采用了“发送——确认”机制来确保消息能够正确接收。每个消息都要需要被确认(ack)后才算是正确接收。
如果这个开发者所开发的软件忘记了确认操作(ack),那么RabbitMQ Server不会再发送数据给它,因为Server认为这个Consumer处理能力有限。
3.2 RabbitMQ消息分发机制
实际上,从图3-1可以看出,消息发送者的消息进入了交换机(Exchange)后,RabbitMQ会通过“routing keys”,找到应该把这个消息绑定到相应的哪个队列(queue)里。
RabbitMQ在将消息从交换机(Exchange)最终投递到“消息消费者”去的时候,一共有三种分发方式:
①Direct exchange:直接匹配模式,如果routing key匹配,那么Message就会被传递到相应的queue中。其实在queue创建时,它会自动的以queue的名字作为routing key来绑定那个exchange。这种方式主要适合用于有明确订阅关系的情况下使用。
②Fanout exchange:广播方式,这种方式会向所有的队列发送消息进行广播,适用于通知类型的消息发送。
③Topic exchange:主题式方式,这种方式会以key进行模式匹配,比如通配符⋆号来发送消息,如xy⋆就可以把消息发送到到所有匹配到xy⋆的队列(queue)中去。此模式非常适合于分组发送消息的场景下所使用。
4 结束语
在实际的软件开发过程中,RabbitMQ在需要处理异步消息的大型应用场景中是非常常见的一个解决方案。本文对RabbitMQ进行了介绍、运行机制分析、消息分发机制分析进行了探讨以期为需要使用异步消息处理框架的开发者提供思路。
[1]anzhsoft.Detailed Introduction详细介绍[N/OL].http://blog.csdn.net/anzhsoft/article/details/19563091
[2]RabbtMQ官网http://www.rabbitmq.com/
[3]袁佳,郭燕慧基于rabbitmq的海量日志的分布式处理[D].北京邮电大学计算机学院2013.07
[4]鱼朝伟詹舒波基于RabbitMQ的异步全双工消息总线的实现[D]北京邮电大学网络技术研究院2016.02