RabbitMQ:工作模式
跳到导航
跳到搜索
简单队列
最简单的队列模式,只有一个消息生产者,一个消息消费者,一个队列,也称为点对点模式、一对一模式。
- 消息的顺序是先进先出严格一致的,因为只有一个队列和一个消费者,消息只能一个个消费,自然消息顺序严格一致。
架构图:
P 代表生产者 , C 代表消费者,红色代表队列。
应用场景:
- 适合比较简单的一对一消息通信,且不需要并发消费的场景,例如: 单一的异步发短信、发邮件、异步推送。
工作队列(Work模式)
RabbitMQ 工作队列(Work模式),一个生产者,多个消费者,每条消息只能被一个消费者消费,支持并发消费消息。
- 相对于简单队列来说就是支持并发消费消息,但是一条消息只能被一个消费者处理,因此Work模式也是一对一消费模式。
- 在多个消费者并发消费同一个队列的消息的情况下,无法保证消息的严格顺序:
- 例如:队列中有10条消息,有10个消费者并发处理10个消息,有些消费者执行快、有些执行慢点,这个时候会出现消息处理的顺序,跟队列中消息的顺序不一致,可能后面的消息先执行成功,前面的消息还在处理中,如果你的业务对消息的顺序有严格要求,可以控制每个队列只有一个消费者,这样就可以保证严格消息处理顺序,代价就是并发能力下降。
架构图:
P 代表生产者 , C1、C2 代表消费者,红色代表队列。
应用场景:
- 单一业务,一对一并发处理,例如:群发邮件,需要发送1000封邮件,可以开启100个消费者,一次并发发送100封邮件。
发布订阅模式(广播模式、fanout模式)
发布订阅模式,就是一个生产者发送的消息会被多个消费者获取,因为一条消息会被多个消费者分别消费处理,所以也叫广播模式、一对多模式。
- 因为RabbitMQ实现发布订阅模式使用的 exchange 类型是 fanout,所以也叫 fanout 模式:将接收到的所有消息广播到它知道的所有队列。
架构图:
- P 代表生产者 , C1、C2 代表消费者,红色代表队列, X代表交换机(Exchange);
- 交换机(Exchange)负责将消息转发至绑定交换机的所有队列;
- 可以定义多个队列,分别绑定同一个交换机;
- 每个队列可以有一个或者多个消费者;
- 同一个队列,一条消息只能被一个消费者处理,fanout 模式之所以能够实现消息广播,本质上是通过多个消息队列实现。
应用场景:
- 发布订阅模式,是一种比较常用一对多消费模式,例如:电商下单之后产生下单消息、仓库模块订阅下单消息处理发货、通知模块订阅下单消息处理发短信、积分模块订阅下单消息处理积分等等,按需订阅消息,实现业务扩展,是一种低耦合的设计模式。
路由模式(Direct 模式)
RabbitMQ 路由模式大体上跟发布订阅模式一样,区别在于发布订阅模式将消息转发给所有绑定的队列,而路由模式将消息转发给那个队列是根据路由匹配情况决定的。
架构图:
- P 代表生产者 , C1、C2 代表消费者,红色代表队列,X 代表交换机;
- 交换机类型为 direct;
- direct 交换机转发消息逻辑:将消息中的 Routing key 与该 Exchange 关联的所有 Binding 中的 Routing key 进行比较,如果相等,则发送到该 Binding 对应的 Queue 中。
- 如上图:如果消息的routing key = orange,则转发至Q1队列,消息的routing key = black和green则转发至Q2队列。
- direct 交换机转发消息逻辑:将消息中的 Routing key 与该 Exchange 关联的所有 Binding 中的 Routing key 进行比较,如果相等,则发送到该 Binding 对应的 Queue 中。
应用场景:
- 路由模式是在发布订阅模式的基础上进行了扩展,因此应用场景跟发布订阅模式类似,区别是允许设置消息订阅的条件。
例如:
- 某电商网站,有华东、华南、华北、西南四个仓库,每个仓库部署了一套仓储系统,用户购物下单后,由最近的仓库负责发货。
- 用户下单后产生下单消息,我们希望将消息转发至对应的地区的仓储系统处理,可以使用路由模式。
- 四个仓储系统的发货队列绑定的routing key如下:
- 华东 = east
- 华北 = north
- 华南 = south
- 西南 = west
- 用户下单后计算用户地址属于哪个地区,算出routing key,然后发送下单消息的时候携带routing key即可,RabbitMQ direct交换机会转发至对应的队列。
主题模式(Topic 模式)
RabbitMQ“主题模式(Topic)”跟“路由模式”类似,区别在于主题模式的路由匹配支持通配符模糊匹配,而路由模式仅支持完全匹配。
- 如果 routing key 没有匹配任何队列,则丢弃消息。如果 routing key 等于空则跟“fanout模式”一样,直接转发消息给所有队列。
topic 支持的通配符如下:
- “#”:匹配一个或多个单词;
- 如果仅使用“#”,则会匹配所有 routing key,效果同“fanout模式”;
- “*”:仅匹配一个单词;
- 如果不使用“#”和“*”,则会匹配唯一 routing key,效果同“direct模式”;
架构图:
- P 代表生产者 , X 代表交换机,红色Q1、Q2代表队列,C1、C2 代表消费者;
- 交换机类型为 topic;
- topic 交换机转发消息逻辑:将消息中的 Routing key 与该 Exchange 关联的所有 Binding 中的 Routing key 进行模糊匹配,如果匹配则发送到该 Binding 对应的 Queue 中。
- 如上图:如果消息的 routing key = “quick.orange.rabbit”,则匹配Q1和Q2两个队列。
- topic 交换机转发消息逻辑:将消息中的 Routing key 与该 Exchange 关联的所有 Binding 中的 Routing key 进行模糊匹配,如果匹配则发送到该 Binding 对应的 Queue 中。
应用场景:
- 跟路由模式一样,区别就是订阅条件更灵活,即Routing key的匹配规则更灵活。