聊一聊RabbitMQ六种工作模式与应用场景

x33g5p2x  于2021-09-27 转载在 RabbitMQ  
字(2.1k)|赞(0)|评价(0)|浏览(653)

简介

今天我们来聊一聊 RabbitMQ 的工作模式与其对于的应用场景有哪些。

你可能会疑惑,作为 MQ 不就是生产者将消息发送到 MQ ,再讲消息发送到消费者哪里,任务不就完成了吗?

其实,不是这样的,MQ 的使用会根据业务场景的不同,也会选择不同的消息工作模式。

基本组件与概念

在说六中工作模式前,需要先了解一下 RabbitMQ 的基本组件与概念,这样才能更好的学习 RabbitMQ 其工作模式。

  • Producer
    生产者,消息的提供者
  • Consumer
    消费者,消息的使用者
  • Broker
    MQ 服务器,管理队列、消息及相关信息
  • Message
    消息,程序间的通信的数据
  • Queue
    队列,消息存放的容器,消息先进先出
  • Exchang
    交换机是 RabbitMQ 特有的概念,用于分发消息

六种工作模式

1. 简单模式

这个比较简单,就是一个生产者、一个队列、一个消费者,这种交换机是不参与的。

2. 工作队列

创建一个工作队列(Work Queue),它会发送一些耗时的任务给多个工作者(Worker)。

在多个消息的情况下,Work Queue 会将消息分派给不同的消费者,每个消费者都会接收到不同的消息,并且可以根据处理消息的速度来接收消息的数量,进而让消费者程序发挥最大性能。

Work Queue 特别适合在集群环境中做异步处理,能最大程序发挥每一台服务器的性能。

在高并发情况下,队列里面的消息很容易产生积压,此模式可以扩容消费者进行负载均衡处理消息。
接下来,我们看看实际使用场景

例如:12306,如果实时发送短信,量不大还好,像节假日这样的情况,没有 MQ 发送短信的访问必然会撑不住大量的并发。

如果改为了 MQ 方式,就可以进行异步处理,且短信涉及到的网络情况时间还长,与第三方交互也会有些情况,改用 MQ 异步处理,就可以支持更多的并发,也可以根据业务的量进行随时扩容。

3. 发布订阅

发布订阅是作为生产者产生的一个消息,他的消费者都是可以收到此条消息的。上图,就可以清晰的说明,生产者将消息发给了 broker ,此模式中前面说的交换机,就可以派上用场了。

交换机的作用是将收到的消息,发给多套副本队列,对于的消费者如果订阅了这个队列的话,就可以收到生产者的消息了。

发布/订阅模式中,生产者不再直接与队列绑定,而是将数据发送至“交换机 Exchange ”。

交换机 Exchange 用于将数据按某种规则送入与之绑定的队列,进而供消费者使用。

发布/订阅模式中,交换机将无差别的将所有消息送入与之绑定的队列,所有消费者拿到的消息完全相同。
接下来,我们看看实际使用场景

发布订阅模式因为所有消费者获得相同的消息,所以特别适合“数据提供商与应用商”。

例如:中国气象局提供“天气预报”送入交换机,网易、新浪、百度、搜狐等门户接入通过队列绑定到该交换机,自动获取气象局推送的气象数据。

例如:有一个新闻机构,每天都会有些独家消息,就可以开个付费专栏。对于其他一些消息平台,想每天收到这家机构提供的独家新闻时,就可以使用使用此模式。

但是作为发布订阅模式也有许多的不足,就拿举的新闻例子来说,如果新闻机构里面分为娱乐、新闻、社会等模块呢,那么发布一次就会让所有的消费者收到,显然这是不符合需求的。针对这个问题发布订阅模式可以进行解决。接着往下看

4. 路由模式

路由(Routing)模式是在发布订阅模式基础上的变种,发布订阅模式是无条件将所有消息分发给所有消费者队列。路由模式则是 Exchange 根据 Routing Key 有条件的将数据筛选后发给消费者队列。

就用上图不同级别日志来说,对于 error 级别的日志信息可能是我们需要特别关注的,会被单单独的消费者进行处理,此时交换机分发消息是有条件的进行分发,这个就是根据 Routing Key 进行不同的消息分发。

路由模式是一种精准的匹配,只有设置了 Routing Key 消息才能进行分发。可以,在实际的工作中还有一些非常模糊的情况,也就是路由模式的升级版,主题模式。

5. 主题模式

主题模式是在原有的 Routing Key 增加了通配符,可以进行 Routing Key 的模糊匹配,进行更加灵活的消息分发。

/*和/#,分表是主题模式的通配符,/*代表单个关键字,/#代表多个关键字。

在实际使用场景中, 路由模式的效率是高于主题模式,实际工作中可以使用路由模式解决的问题就尽量不要采用主题模式。

6. RPC同步通信

我们都清楚作为 MQ 本质上都是异步通讯的,作为生产者将消息送达消息队列后呢,作为生产者他的任务就完成了。至于消费者什么时候消费的最终结果呢,生产者是不关心的。

但是很多时间,异步情况并不能满足我们的需求。很多时候生产者产生消息之后,需要得到消费者消费的结果。这种情况下非常像平时的 RPC 远程调用,这种情况下 RabbitMQ 也提供了对应得工作模式。

这里实际上有两个队列,作为 clinet 产生了消息后,会将 broker 会将消息放入队列。

接着,会被 server 进行消费,消费后的结果也会放入队列,之后会被 client 进行处理。

而这整个过程,线程会进入阻塞状态,这种模式在实际工作中不怎么用。

相关文章