RabbitMq工作模式

789 阅读4分钟
  1. Work Queue工作队列模式
  2. Publish/Subscribe 发布订阅模式
  3. Routing 路由模式
  4. Topics 通配符
  5. Header 转发器
  6. RPC 远程调用

一、Work Queue工作队列模式

image.png

  1. 一个生产者将消息发送给一个队列
  2. 多个消费者共同监听同一个队列
  3. 消息不能被重复消费
  4. RabbitMq采用轮询的方式将消息平均发送给消费者

二、Publish/Subscribe发布订阅模式

image.png

  1. 生产者将消息发送给交换机
  2. 与交换机绑定的有多个队列,每个消费者监听自己的队列
  3. 生产者将消息发送给交换机,有交换机将消息转发到绑定此交换机的队列,每个绑定交换机的队列都将接受到消息
Publish/Subscribe和Work Queue有什么区别?

1、publish/subscribe可以定义一个交换机绑定多个队列,一个消息可以发送给多个队列 2、Work queue无需定义交换机,一个消息只能发送给一个队列 3、Publish/Subscribe比Work Queue功能更加强大,也可以将多个消费者监听同一个队列实现Work Queue功能

三、Routing模式

image.png

  1. 一个交换机绑定多个队列,每个队列设置routingKey,并且一个队列可以设置多个routingKey
  2. 每个消费者监听自己的队列
  3. 生产者将消息发给交换机,发送消息时需要指定routingKey的值,交换机来判断routingKey的值和哪个队列的routingKey相等,如果相等则将消息转发给该队列
Routing模式和Publish/Subscribe模式的区别?

1、Publish/Subscribe在绑定交换机时不需要指定routingKey,消息将会发送到每个绑定交换机的队列 2、Routing模式要求队列在绑定交换机时要指定routingKey(这就是队列routingKey),发送消息将消息发送至和routingKey值相等的队列中,如上图所示,每个队列可以指定多个routingKey,如果发送消息时指定routingKey值为error,由于C1、C2的routingKey都是error,所以消息发送给了C1、C2。如果发送消息时routingKey指定为Info,只有C2可以接收到消息 3、所以routing模式更强大,它可以实现Publish/Subscribe的功能

四、Topics模式

image.png

  1. 一个交换机可以绑定多个队列,每个队列可以设置一个或多个带通配符的routingKey
  2. 生产者将消息发送给交换机,交换机根据routingKey的值来匹配队列,匹配时采用通配符方式,匹配成功将消息转发至指定的队列。
Topics和Routing的区别?

1、Topics和Routing的基本原理相同,即生产者将消息发送给交换机,交换机根据routingKey将消息转发给与routingKey匹配的队列。 2、不同之处是:routingKey的匹配方式,routing模式是相等匹配,Topics模式是通配符匹配

符号#:匹配一个或多个词(每个词中间以.分割),比如inform.#可以匹配inform.sms、inform.email、inform.sms.email
符号*:只能匹配一个词,比如inform.*可以匹配inform.sms、inform.email

五、Header模式

header模式与routing模式不同的地方在于,header模式取消routingKey,使用header中的key/value键值对匹配队列

六、RPC

RPC即客户端远程调用服务端的方法,使用MQ可以实现RPC的异步调用,基于direct交换机实现,流程如下:

  1. 客户端即是生产者又是消费者,向RPC请求队列发送RPC调用消息,同时监听RPC响应队列
  2. 服务端监听RPC请求队列的消息,收到消息后执行服务端的方法,得到方法返回的结果
  3. 服务端将RPC方法的结果发送到RPC响应队列

RabbitMq延时队列实现原理:

由于RabbitMq本身没有提供延时队列的功能,所以需要借助一些特性来实现延时队列,利用RabbitMq 1、 RabbitMq可以针对Message和Queue,设置x-message-ttl来控制消息的生存时间,如果超时消息变为dead letter(死信) 2、RabbitMq的Queue可以配置x-dead-letter-Exchange和x-dead-letter-routing两个参数,来控制队列出现dead-letter的时候,重新发送消息的目的地
比如:设置一条消息存活时间为10秒钟