消息队列RabbitMQ的几种工作模式
Posted 山东省云计算中心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息队列RabbitMQ的几种工作模式相关的知识,希望对你有一定的参考价值。
RabbitMQ是一种常用的轻量级消息队列, 它可以支持AMQP,XMPP,SMTP,STOMP协议,实现了一个Broker架构,消息在发送时有一个排队的过程,此外,RabbitMQ在路由、负载均衡以及数据持久化方面都有很好的支持,它能够支持主流操作系统(linux,windows,macox等)和多种客户端开发语言(Java、Python、Ruby、.NET,php、C/C++、Node.js等),非常适合企业级开发。
01
RabbitMQ一些基本概念
生产者:消息的产生者。
消费者:一个消费者是一个程序,主要是等待接收信息。
队列:队列位于RabbitMQ内部,是消息的存储位置,本质上,队列是一个大的消息缓冲器,在队列的两端,分别是生产消息的生产者和接收消息的消费者,一个队列可以同时连接多个生产者和消费者。
注意事项:在消息推送到队列之前,应首先声明队列(由生产者端或消费者端声明均可),有时由于不确定生产者端和消费者端的启动顺序,会在生产者程序和消费者程序中都对队列进行声明。
Exchange:在RabbitMQ中,消息不能直接被推送到queue中,而是需要通过exchange,生产者甚至不会消息是否会被推送到队列中。而是经过exchange推送到队列中去,根据exchange类型的不同,来决定对消息的处理,比如可能会将消息推送到指定的队列中,或发送到多个队列中,或将消息丢弃.exchange 的类型有Direct、Topic、Headers、Fanout四种,每一种类型都会被应用到不同的场景中。
02
RabbitMQ消息传递模式
总的来说,消息在RabbitMQ的传递可以总结为两大类:
❶消息不会被重复使用
消息生产者生产消息发送到queue中,消息消费者从queue中取出并且消费消息。消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费,也就是说,队列总的消息不能被重复消费。
❷消息会被重复使用
消息生产者(发布)将消息发布到中Queue,如同时有多个消息消费者(订阅)消费该消息,发布者发送的消息会通过路由同时写到多个Queue,也就是每个队列中都有这条消息的拷贝,发布到topic的消息会被所有订阅者消费,每个消费者都能够收到这条消息,消息会被重复消费。
03
RabbitMQ应用场景模式
在RabbitMQ的官方文档中,列举了以下几个消息传递场景。
❶简单模式
一个生产者端生产消息到“hello”队列中,一个消费者从队列的另一端接收消息。
❷工作队列模式
工作队列模式是为了让多个消费者能够同时执行资源密集型任务。生产者端将任务封装成消息,并将其发送到队列。在另一端运行的消费者进程接收到消息并进行处理。当同时运行很多个消费者的worker时,将会分担任务。
在这种模式中,一个生产者,对应多个消费者,每个消费者获取到的消息唯一(不会与其他消费者的worker获取相同的而消息),多个消费者只有一个队列。
❸发布/订阅模式
发布/订阅模式的应用场景是一个生产者发送的消息会被多个消费者获取,每个接收端程序副本都会收到同样的消息,用来完成不同(或同样)的工作。
在前文中介绍过,在RabbitMQ中的exchange有Direct、Topic、Headers、Fanout四种,在发布订阅模式中,使用的就是Fanout类型。Fanout类型非常简单,它是将所有收到的消息广播到所有已知的队列。
这种模式中有一个生产者产生的消息通过exchange推送到多个队列中,而连接这些队列的每个消费者获取都获取与其他消费者相同的消息。
❹路由(routing)模式
在实际的使用场景中,存在一种场景:已给生产者的消息被不同的消费者接收,每个消费者的要处理的消息却可能不同,而发布订阅模式下,每个消费者端收到的消息是不同的,所以无法满足这种应用场景。
路由模式正是为了这种用用场景产生的,在路由模式下,exchange的类型为Direct,exchange与队列绑定时,会有一个路由key(routing key),通过这个关键字,将不同的消息发送到不同的队列中,消费者端就能收到不同的消息了。
如下图所示,exchange通过orange 做为routingkey与队列Q1绑定时,通过black和green做为routingkey与队列Q2绑定。
在这种情形下,发布到orange路由routing key的消息将被推送到Q1队列中,发布到black和green路由routing key 被推送到Q2队列中。当然,不同的队列也可以使用相同的routing key,这种情况下,与使用Fanout exchange广播模式是一样的,如下图所示。
❺主题(topic)模式
刚刚讨论的路由(routing)模式中,每个队列与exchange通过routingkey绑定后,可以接受一类消息,不过有时消息不仅有一个属性,比如在日志记录系统中,日志不仅有severity,还可能来自不同的数据源,如果此时需要记录来自于某一个数据源的某一种(或几种)消息,仅用severity绑定exchange和queue可能无法满足要求。
Topic模式的设计满足了上述应用场景,在topic模式中,发送到主题交换机的消息不再使用任意的routingkey, 而是使用由点号分隔的单词列表。这些词可以是任何东西,但通常它们指定与消息相关联的一些功能。例如:information.info,information.error,notification.error等,路由密钥中可以有任意多的单词,最多可达255个字节。
routing key还可以使用通配符,将队列与exchange的绑定,能有效地扩大队列接受的消息范围,通配符的含义如下:
符号#:匹配一个或者多个词 lazy.# 可以匹配 lazy.irs或者lazy.irs.cor
符号*:只能匹配一个词 lazy.* 可以匹配 lazy.irs或者lazy.cor
在上图表示的应用场景中,一个消费者产生的消息,根据exchange与queue绑定时的routing key的不同,会接受不同种类的消息,所有routing key中包含orange的消息都会被推送到Q1队列中,而routing key中包含rabbit或lazy的消息都会被推送到Q2队列中.
❻RPC模式
RPC即远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,使得开发包括网络分布式多程序在内的应用程序更加容易。可以RabbitMQ构建一个RPC系统。
在这个RPC系统中,包含了调用端(client)和服务器端(server),client端把需要server处理的数据通过队列发送给server端,server经过计算,再将结果通过回调队列返回给client端。
在这种情形下,client和server会同时作为生产者和消费者,将消息发送并接受,两者之间通过一个Correlation id标记,来标明队列中的消息属于哪次调用。
04
总结
本文描述了rabbitmq的一些基本概念,并对其支持的几种工作模式进行了分析和解释,每种工作模式可以运用到不同的引用场景。
参考链接:http://www.rabbitmq.com/getstarted.htm
▼
更多精彩动态,尽在山东省云计算中心!
以上是关于消息队列RabbitMQ的几种工作模式的主要内容,如果未能解决你的问题,请参考以下文章