RabbitMQ的6种工作模式详解及应用场景

1.组件介绍

1.Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输,
2. Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
3. Queue:消息的载体,每个消息都会被投到一个或多个队列。
4. Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来.
5. Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
6. vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限分离。
7. Producer:消息生产者,就是投递消息的程序.
8. Consumer:消息消费者,就是接受消息的程序.
9. Channel:消息通道,在客户端的每个连接里,可建立多个channel.
2 消息发布和接收流程

RabbitMQ几种工作模式

1、简单模式
2、Work queues
3、Publish/Subscribe
4、Routing
5、Topics
6、RPC

1. 简单模式

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

2.Work queues

应用场景

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

3.Publish发布订阅模式

生产者->交换机->(多个)队列->消费者
发布订阅模式:
1、每个消费者监听自己的队列。
2、生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息

应用场景

一条消息, 会经过交换机, 同时发送到 多个 队列里面去, 多个队列数据是一样的.

4.Routing路由模式

路由模式:
1、每个消费者监听自己的队列,并且设置routingkey。
2、生产者将消息发给交换机,由交换机根据routingkey来转发消息到指定的队列。

应用场景

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

5.Topics 统配符模式

路由模式:
1、每个消费者监听自己的队列,并且设置带统配符的routingkey。
2、生产者将消息发给broker,由交换机根据routingkey来转发消息到指定的队列。

应用场景

主题模式是在原有的 Routing Key 增加了通配符,可以进行 Routing Key 的模糊匹配,进行更加灵活的消息分发。
和#,分表是主题模式的通配符,代表单个关键字,#代表多个关键字。

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

6.RPC

RPC即客户端远程调用服务端的方法 ,使用MQ可以实现RPC的异步调用,基于Direct交换机实现,流程如下:
1、客户端即是生产者就是消费者,向RPC请求队列发送RPC调用消息,同时监听RPC响应队列。
2、服务端监听RPC请求队列的消息,收到消息后执行服务端的方法,得到方法返回的结果
3、服务端将RPC方法 的结果发送到RPC响应队列
4、客户端(RPC调用方)监听RPC响应队列,接收到RPC调用结果。

应用场景

我们都清楚作为 MQ 本质上都是异步通讯的,作为生产者将消息送达消息队列后呢,作为生产者他的任务就完成了。至于消费者什么时候消费的最终结果呢,生产者是不关心的。
但是很多时间,异步情况并不能满足我们的需求。很多时候生产者产生消息之后,需要得到消费者消费的结果。这种情况下非常像平时的 RPC 远程调用,这种情况下 RabbitMQ 也提供了对应得工作模式。

这里实际上有两个队列,作为 clinet 产生了消息后,会将 broker 会将消息放入队列。
接着,会被 server 进行消费,消费后的结果也会放入队列,之后会被 client 进行处理。
而这整个过程,线程会进入阻塞状态,这种模式在实际工作中不怎么用。

posted @ 2022-06-02 15:06  宁君  阅读(295)  评论(0编辑  收藏  举报