【RabbitMQ六种队列模式与应用场景】
【一】RabbitMQ
- Producer:生产者,消息的提供者
- Consumer:消费者,消息的使用者
- Broker:MQ服务器,管理队列、消息及相关信息
- Message:消息,程序间的通信的数据
- Queue:队列,消息存放的容器,消息先进先出
- Exchange:交换机,用于分发消息
【二】RabbitMQ的六种队列模式
【1】简单模式
- 这个比较简单,就是一个生产者、一个队列、一个消费者,这种交换机是不参与的。
【2】工作队列模式
(1)介绍
- 创建一个工作队列(Work Queue),它会发送一些耗时的任务给多个工作者(Worker)。
- 在多个消息的情况下,Work Queue 会将消息分派给不同的消费者,每个消费者都会接收到不同的消息,并且可以根据处理消息的速度来接收消息的数量,进而让消费者程序发挥最大性能。
- Work Queue 特别适合在集群环境中做异步处理,能最大程序发挥每一台服务器的性能。
- 在高并发情况下,队列里面的消息很容易产生积压,此模式可以扩容消费者进行负载均衡处理消息。
(2)使用场景
- 12306,如果实时发送短信,量不大还好,像节假日这样的情况,没有 MQ 发送短信的访问必然会撑不住大量的并发。
- 如果改为了 MQ 方式,就可以进行异步处理,且短信涉及到的网络情况时间还长,与第三方交互也会有些情况,改用 MQ 异步处理,就可以支持更多的并发,也可以根据业务的量进行随时扩容。
【3】发布订阅模式
(1)介绍
- 发布订阅是作为生产者产生的一个消息,他的消费者都是可以收到此条消息的。
- 上图,就可以清晰的说明,生产者将消息发给了 broker ,此模式中前面说的交换机,就可以派上用场了。
- 交换机的作用是将收到的消息,发给多套副本队列,对于的消费者如果订阅了这个队列的话,就可以收到生产者的消息了。
- 发布/订阅模式中,生产者不再直接与队列绑定,而是将数据发送至“交换机 Exchange ”。
- 交换机 Exchange 用于将数据按某种规则送入与之绑定的队列,进而供消费者使用。
- 发布/订阅模式中,交换机将无差别的将所有消息送入与之绑定的队列,所有消费者拿到的消息完全相同。
(2)发布/订阅模式使用场景
- 发布订阅模式因为所有消费者获得相同的消息,所以特别适合“数据提供商与应用商”。
- 例如:
- 中国气象局提供“天气预报”送入交换机
- 网易、新浪、百度、搜狐等门户接入通过队列绑定到该交换机,自动获取气象局推送的气象数据。
- 例如:
- 有一个新闻机构,每天都会有些独家消息,就可以开个付费专栏。
- 对于其他一些消息平台,想每天收到这家机构提供的独家新闻时,就可以使用使用此模式。
- 但是作为发布订阅模式也有许多的不足,就拿举的新闻例子来说
- 如果新闻机构里面分为娱乐、新闻、社会等模块呢,那么发布一次就会让所有的消费者收到
- 显然这是不符合需求的。针对这个问题发布订阅模式可以进行解决。接着往下看
【4】路由模式
- 路由(Routing)模式是在发布订阅模式基础上的变种,发布订阅模式是无条件将所有消息分发给所有消费者队列。
- 路由模式则是 Exchange 根据 Routing Key 有条件的将数据筛选后发给消费者队列。
- 就用上图不同级别日志来说,对于 error 级别的日志信息可能是我们需要特别关注的,会被单单独的消费者进行处理,此时交换机分发消息是有条件的进行分发,这个就是根据 Routing Key 进行不同的消息分发。
- 路由模式是一种精准的匹配,只有设置了 Routing Key 消息才能进行分发。
- 可以在实际的工作中还有一些非常模糊的情况,也就是路由模式的升级版,主题模式。
【5】主题模式
- 主题模式是在原有的 Routing Key 增加了通配符,可以进行 Routing Key 的模糊匹配,进行更加灵活的消息分发。
*
和#
,分表是主题模式的通配符*
代表单个关键字#
代表多个关键字
- 在实际使用场景中, 路由模式的效率是高于主题模式,实际工作中可以使用路由模式解决的问题就尽量不要采用主题模式。
【6】RPC同步通信(阻塞)
-
我们都清楚作为 MQ 本质上都是异步通讯的,作为生产者将消息送达消息队列后呢,作为生产者他的任务就完成了。
- 至于消费者什么时候消费的最终结果呢,生产者是不关心的。
-
但是很多时间,异步情况并不能满足我们的需求。
- 很多时候生产者产生消息之后,需要得到消费者消费的结果。
- 这种情况下非常像平时的 RPC 远程调用,这种情况下 RabbitMQ 也提供了对应得工作模式。
-
这里实际上有两个队列,作为 clinet 产生了消息后,会将 broker 会将消息放入队列。
-
接着,会被 server 进行消费,消费后的结果也会放入队列,之后会被 client 进行处理。
-
而这整个过程,线程会进入阻塞状态,这种模式在实际工作中不怎么用。
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17691742.html