RabbitMQ的常见队列模型,simple模式、work模式、fanout模式、direct模式、topic模式、headers模式、RPC

目录

一、simple模式

simple模式实现-生产者 

simple模式实现-消费者 

二、work模式(能者多劳模式)

work模式实现-生产者

work模式实现-消费者

三、订阅模式-fanout

fanout模式实现-生产者

fanout模式实现-消费者

四、订阅模式-direct 

direct模式实现-生产者

direct模式实现-消费者  

 五、订阅模式-topic

topic模式实现-生产者

topic模式实现-消费者

六、 订阅模式-headers

七、RPC


一、simple模式

  • 即简单的点对点消息模型。开启mq服务,开启进程P 生产者向mq 写消息,进程C消费者监听mq,消费消息。

  • simple模式实现-生产者 

  • simple模式实现-消费者 

二、work模式(能者多劳模式)

  •  一个生产者P,对应了多个消费者C。这些多个C,消费的消息各自不同,C1和C2 消费的消息,构成所有消息的一个全集。可开启C的消费竞争 channel.basicQos(1);C1和C2 能者多劳。

  • work模式实现-生产者

  • work模式实现-消费者

三、订阅模式-fanout

  • 订阅模式中会用到交换机。根据交换机类型的不同,订阅模式的效果也会有所不同。
  • 所有发送到该交换器的消息全部发送到其对应的队列中 

  • fanout模式实现-生产者

  • fanout模式实现-消费者

四、订阅模式-direct 

  • 把消息路由到那些binding key和routing key一致的队列中

  • direct模式实现-生产者

  •  direct模式实现-消费者  

 五、订阅模式-topic

  • 与direct类型的Exchage相似,也是将消息路由到binding key与routing key相匹配的Queue中,但这里的匹配规则有些不同,它约定:
  • routing key为一个句点号“. ”分隔的字符串(我们将被句点号“. ”分隔开的每一段独立的字符串称为一个单词),如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”
  • binding key与routing key一样也是句点号“. ”分隔的字符串
  • binding key中可以存在两种特殊字符“*”与“#”,用于做模糊匹配,其中“*”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)

  • topic模式实现-生产者

  •   topic模式实现-消费者

六、 订阅模式-headers

  • 不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。 在绑定Queue与Exchange时指定一组键值对;当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对;如果完全匹配则消息会路由到该Queue,否则不会路由到该Queue。

七、RPC

  • MQ本身是基于异步的消息处理,前面的示例中所有的生产者(P)将消息发送到RabbitMQ后不会知道消费者(C)处理成功或者失败(甚至连有没有消费者来处理这条消息都不知道)。 但实际的应用场景中,我们很可能需要一些同步处理,需要同步等待服务端将我的消息处理完成后再进行。