【RabbitMQ六种队列模式与应用场景】

【一】RabbitMQ

img

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

【二】RabbitMQ的六种队列模式

【1】简单模式

img

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

【2】工作队列模式

(1)介绍

img

  • 创建一个工作队列(Work Queue),它会发送一些耗时的任务给多个工作者(Worker)。
  • 在多个消息的情况下,Work Queue 会将消息分派给不同的消费者,每个消费者都会接收到不同的消息,并且可以根据处理消息的速度来接收消息的数量,进而让消费者程序发挥最大性能。
  • Work Queue 特别适合在集群环境中做异步处理,能最大程序发挥每一台服务器的性能。
  • 在高并发情况下,队列里面的消息很容易产生积压,此模式可以扩容消费者进行负载均衡处理消息。

(2)使用场景

  • 12306,如果实时发送短信,量不大还好,像节假日这样的情况,没有 MQ 发送短信的访问必然会撑不住大量的并发。
  • 如果改为了 MQ 方式,就可以进行异步处理,且短信涉及到的网络情况时间还长,与第三方交互也会有些情况,改用 MQ 异步处理,就可以支持更多的并发,也可以根据业务的量进行随时扩容。

img

【3】发布订阅模式

(1)介绍

img

  • 发布订阅是作为生产者产生的一个消息,他的消费者都是可以收到此条消息的。
    • 上图,就可以清晰的说明,生产者将消息发给了 broker ,此模式中前面说的交换机,就可以派上用场了。
  • 交换机的作用是将收到的消息,发给多套副本队列,对于的消费者如果订阅了这个队列的话,就可以收到生产者的消息了。
  • 发布/订阅模式中,生产者不再直接与队列绑定,而是将数据发送至“交换机 Exchange ”。
  • 交换机 Exchange 用于将数据按某种规则送入与之绑定的队列,进而供消费者使用。
  • 发布/订阅模式中,交换机将无差别的将所有消息送入与之绑定的队列,所有消费者拿到的消息完全相同。

(2)发布/订阅模式使用场景

  • 发布订阅模式因为所有消费者获得相同的消息,所以特别适合“数据提供商与应用商”。
  • 例如:
    • 中国气象局提供“天气预报”送入交换机
    • 网易、新浪、百度、搜狐等门户接入通过队列绑定到该交换机,自动获取气象局推送的气象数据。
  • 例如:
    • 有一个新闻机构,每天都会有些独家消息,就可以开个付费专栏。
    • 对于其他一些消息平台,想每天收到这家机构提供的独家新闻时,就可以使用使用此模式。
  • 但是作为发布订阅模式也有许多的不足,就拿举的新闻例子来说
  • 如果新闻机构里面分为娱乐、新闻、社会等模块呢,那么发布一次就会让所有的消费者收到
  • 显然这是不符合需求的。针对这个问题发布订阅模式可以进行解决。接着往下看

【4】路由模式

img

  • 路由(Routing)模式是在发布订阅模式基础上的变种,发布订阅模式是无条件将所有消息分发给所有消费者队列。
    • 路由模式则是 Exchange 根据 Routing Key 有条件的将数据筛选后发给消费者队列。
  • 就用上图不同级别日志来说,对于 error 级别的日志信息可能是我们需要特别关注的,会被单单独的消费者进行处理,此时交换机分发消息是有条件的进行分发,这个就是根据 Routing Key 进行不同的消息分发。
    • 路由模式是一种精准的匹配,只有设置了 Routing Key 消息才能进行分发。
    • 可以在实际的工作中还有一些非常模糊的情况,也就是路由模式的升级版,主题模式。

【5】主题模式

img

  • 主题模式是在原有的 Routing Key 增加了通配符,可以进行 Routing Key 的模糊匹配,进行更加灵活的消息分发。
  • *#,分表是主题模式的通配符
    • *代表单个关键字
    • #代表多个关键字
  • 在实际使用场景中, 路由模式的效率是高于主题模式,实际工作中可以使用路由模式解决的问题就尽量不要采用主题模式。

【6】RPC同步通信(阻塞)

img

  • 我们都清楚作为 MQ 本质上都是异步通讯的,作为生产者将消息送达消息队列后呢,作为生产者他的任务就完成了。

    • 至于消费者什么时候消费的最终结果呢,生产者是不关心的。
  • 但是很多时间,异步情况并不能满足我们的需求。

    • 很多时候生产者产生消息之后,需要得到消费者消费的结果。
    • 这种情况下非常像平时的 RPC 远程调用,这种情况下 RabbitMQ 也提供了对应得工作模式。
  • 这里实际上有两个队列,作为 clinet 产生了消息后,会将 broker 会将消息放入队列。

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

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

posted @ 2023-09-10 19:39  Chimengmeng  阅读(440)  评论(0编辑  收藏  举报