RabbitMQ:工作模式

来自Wikioe
跳到导航 跳到搜索


简单队列

最简单的队列模式,只有一个消息生产者,一个消息消费者,一个队列,也称为点对点模式、一对一模式。

  • 消息的顺序是先进先出严格一致的,因为只有一个队列和一个消费者,消息只能一个个消费,自然消息顺序严格一致


架构图:

RabbitMQ工作模式:简单队列.png

P 代表生产者 , C 代表消费者,红色代表队列。


应用场景:

  • 适合比较简单的一对一消息通信,且不需要并发消费的场景,例如: 单一的异步发短信、发邮件、异步推送。

工作队列(Work模式)

RabbitMQ 工作队列(Work模式),一个生产者,多个消费者,每条消息只能被一个消费者消费,支持并发消费消息

  • 相对于简单队列来说就是支持并发消费消息,但是一条消息只能被一个消费者处理,因此Work模式也是一对一消费模式。
  • 在多个消费者并发消费同一个队列的消息的情况下,无法保证消息的严格顺序
    例如:队列中有10条消息,有10个消费者并发处理10个消息,有些消费者执行快、有些执行慢点,这个时候会出现消息处理的顺序,跟队列中消息的顺序不一致,可能后面的消息先执行成功,前面的消息还在处理中,如果你的业务对消息的顺序有严格要求,可以控制每个队列只有一个消费者,这样就可以保证严格消息处理顺序,代价就是并发能力下降。


架构图:

RabbitMQ工作模式:工作队列(Work模式).png

P 代表生产者 , C1、C2 代表消费者,红色代表队列。


应用场景:

  • 单一业务,一对一并发处理,例如:群发邮件,需要发送1000封邮件,可以开启100个消费者,一次并发发送100封邮件。

发布订阅模式(广播模式、fanout模式)

发布订阅模式,就是一个生产者发送的消息会被多个消费者获取,因为一条消息会被多个消费者分别消费处理,所以也叫广播模式、一对多模式。

  • 因为RabbitMQ实现发布订阅模式使用的 exchange 类型是 fanout,所以也叫 fanout 模式:将接收到的所有消息广播到它知道的所有队列


架构图:

RabbitMQ工作模式:发布订阅模式(广播模式、fanout模式).png
  1. P 代表生产者 , C1、C2 代表消费者,红色代表队列, X代表交换机(Exchange);
  2. 交换机(Exchange)负责将消息转发至绑定交换机的所有队列;
  3. 可以定义多个队列,分别绑定同一个交换机;
  4. 每个队列可以有一个或者多个消费者;
  • 同一个队列,一条消息只能被一个消费者处理,fanout 模式之所以能够实现消息广播,本质上是通过多个消息队列实现。


应用场景:

  • 发布订阅模式,是一种比较常用一对多消费模式,例如:电商下单之后产生下单消息、仓库模块订阅下单消息处理发货、通知模块订阅下单消息处理发短信、积分模块订阅下单消息处理积分等等,按需订阅消息,实现业务扩展,是一种低耦合的设计模式。

路由模式(Direct 模式)

RabbitMQ 路由模式大体上跟发布订阅模式一样,区别在于发布订阅模式将消息转发给所有绑定的队列,而路由模式将消息转发给那个队列是根据路由匹配情况决定的。


架构图:

RabbitMQ工作模式:路由模式(Direct 模式).png
  1. P 代表生产者 , C1、C2 代表消费者,红色代表队列,X 代表交换机;
  2. 交换机类型为 direct
    • direct 交换机转发消息逻辑:将消息中的 Routing key 与该 Exchange 关联的所有 Binding 中的 Routing key 进行比较,如果相等,则发送到该 Binding 对应的 Queue 中。
      如上图:如果消息的routing key = orange,则转发至Q1队列,消息的routing key = black和green则转发至Q2队列。


应用场景:

  • 路由模式是在发布订阅模式的基础上进行了扩展,因此应用场景跟发布订阅模式类似,区别是允许设置消息订阅的条件。

例如:

某电商网站,有华东、华南、华北、西南四个仓库,每个仓库部署了一套仓储系统,用户购物下单后,由最近的仓库负责发货。
用户下单后产生下单消息,我们希望将消息转发至对应的地区的仓储系统处理,可以使用路由模式。
四个仓储系统的发货队列绑定的routing key如下:
华东 = east
华北 = north
华南 = south
西南 = west
用户下单后计算用户地址属于哪个地区,算出routing key,然后发送下单消息的时候携带routing key即可,RabbitMQ direct交换机会转发至对应的队列。

主题模式(Topic 模式)

RabbitMQ“主题模式(Topic)”跟“路由模式”类似,区别在于主题模式的路由匹配支持通配符模糊匹配,而路由模式仅支持完全匹配。

  • 如果 routing key 没有匹配任何队列,则丢弃消息。如果 routing key 等于空则跟“fanout模式”一样,直接转发消息给所有队列。


topic 支持的通配符如下:

  1. #”:匹配一个或多个单词;
    • 如果仅使用“#”,则会匹配所有 routing key,效果同“fanout模式”;
  2. *”:仅匹配一个单词;
  • 如果不使用“#”和“*”,则会匹配唯一 routing key,效果同“direct模式”;


架构图:

RabbitMQ工作模式:主题模式(Topic 模式).png
  1. P 代表生产者 , X 代表交换机,红色Q1、Q2代表队列,C1、C2 代表消费者;
  2. 交换机类型为 topic
    • topic 交换机转发消息逻辑:将消息中的 Routing key 与该 Exchange 关联的所有 Binding 中的 Routing key 进行模糊匹配,如果匹配则发送到该 Binding 对应的 Queue 中。
      如上图:如果消息的 routing key = “quick.orange.rabbit”,则匹配Q1和Q2两个队列。


应用场景:

  • 跟路由模式一样,区别就是订阅条件更灵活,即Routing key的匹配规则更灵活。