RabbitMQ消息模式

各个模式相关代码及笔记md已汇总至gitHub专区:

RabbitMQStudy

 

1.RabbitMQ架构

1.1.RabbitMQ核心组成

核心概念:
Server:又称Broker ,接受客户端的连接,实现AMQP实体服务。 安装rabbitmq-server
Connection:连接,应用程序与Broker的网络连接 TCP/IP/ 三次握手和四次挥手
Channel:网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道,客户端可以建立对各Channel,每个Channel代表一个会话任务。
Message :消息:服务与应用程序之间传送的数据,由Properties和body组成,Properties可是对消息进行修饰,比如消息的优先级,延迟等高级特性,Body则就是消息体的内容。
Virtual Host 虚拟地址,用于进行逻辑隔离,最上层的消息路由,一个虚拟主机理由可以有若干个Exhange和Queueu,同一个虚拟主机里面不能有相同名字的Exchange
Exchange:交换机,接受消息,根据路由键发送消息到绑定的队列。(==不具备消息存储的能力==)
Bindings:Exchange和Queue之间的虚拟连接,binding中可以保护多个routing key.
Routing key:是一个路由规则,虚拟机可以用它来确定如何路由一个特定消息。
Queue:队列:也成为Message Queue,消息队列,保存消息并将它们转发给消费者。

 

1.2.RabbitMQ整体架构

 

 从架构图中我们可以看出:RabbitMQ架构包含了:Provider(生产者)Exchanges(交换机)Queues(队列)Consumer(消费者)

 

1.3.RabbitMQ的运行流程

生产者将业务方数据进行可能的包装, 之后封装成消息, 发送( AMQP 协议里这个动作对应的命令为Basic.Publish) 到Broker 中。消费者订阅并接收消息(AMQP 协议里这个动作对应的命令为Basic.Consume 或者Basic. Get) ,经过可能的解包处理得到原始的数据,之后再进行业务处理逻辑。这个业务处理逻辑并不一定需要和接收消息的逻辑使用同一个线程。

消费者进程可以使用一个线程去接收消息,存入到内存中,比如使用Java 中的BlockingQueue 。业务处理逻辑使用另一个线程从内存中读取数据,这样可以将应用进一步解稿,提高整个应用的处理效率。

详细的执行流程过程涉及到的底层通信原理比较复杂,有兴趣的可以了解另一篇博文,写的非常详细,这里就不再做过多地阐述:

rabbitMQ基本概念

rabbitMQ运转流程

 

2.RabbitMQ支持的消息模式

参考官网:https://www.rabbitmq.com/getstarted.html

2.1.简单模式 Simple

 

在简单模式的消息发送中,不需要特别创建交换机(指定交换机的类型),通过默认的交换机Binding Default exchange,通过指定Routing key关联Queues中的queue name向对应的Queue队列发送消息。

注意:

rabbitmq发送消息一定有一个交换机,如果没有创建交换机,默认使用Default_exchange进行绑定。

 

 

最终向queue1中发送消息,获取消息内容如下:

 

Ack Mode:消息应答模式

Nack message:接收消息后不对消息进行应答,及消费者不会回复反馈给生产者,Queue中仍然会保存消息;

Ack message:接收消息并应答,此时生成者受到消费者回复,将Queue中该条消息消费。

 

2.2.工作队列模式 WorkQueues

工作队列模式也是指定的默认的default默认交换机对多个Queue消费者进行消息的发送,

主要有两种模式:
1、轮询模式分发:一个消费者一条,按均分配,平均分,不会因为哪个消费者内部处理速率较快而减少消息的发送;
2、公平分发:根据消费者的消费能力进行公平分发,处理快的处理的多,处理慢的处理的少;按劳分配

 

实际代码上的区别就是公平分发一定要设置应答方式为手动应答,而轮询模式设置为自动应答:

//根据实际场景设置:取决于服务的处理速度、磁盘空间等,为1表示每次只消费1条
finalChannel.basicQos(1); //公平分发一定需要手动应答 finalChannel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);

 

 2.3.发布订阅模式 Publish/Subscribe

发布订阅模式使用fanout类型交换机绑定每一个消费者Queue队列,相当于广播的形式,订阅了该交换机(频道)的Queue都会收到通过交换机发送的来自生产者的消息。

而在此过程中消费者Queues必须与fanout_exchange进行一对一绑定。

 

 

 

 2.4.路由模式Routing

路由模式的交换机类型是:direct类型

路由模式与发布订阅模式非常相似,也非常容易理解。它只是在发布订阅模式上新增了路由key,通过对应的路由key与对应的Queue进行绑定,这个Queue就被key唯一标识了。

然后当交换机再去发送消息的时候,会在绑定了交换机的Queue中指定对应的路由key进行发送,只有对应路由key为发送key一一对应的才能收到消息。

 

测试发给Routing key为error的queue队列(队列都绑定了路由direct_exchange):

 

 

 

 

 

 2.5.主题Topic模式

 

主题模式topics相较于路由模式是非常相似的,只不过在路由的基础之上增加了支持模糊匹配的Routing key的形式。 

主题模式的交换机类型选择必须是topic类型。

匹配规则:

#:表示0个或者多个,取值范围为[0,+无穷大)

*:表示1个,取值为1,即必须要有一个。

 

测试队列Routing key如下,都绑定上了topic主题类型的交换机:

 

 

可以看到,只有queue1与queue2收到了对应的消息:

 

 

2.6.参数模式

参数模式的exchange类型为:headers。

参数模式会在路由匹配时根据相应的Queue携带的参数信息进行匹配,而exchange则根据arguement参数进行一对一发送:

Arguments信息标识,测试选择x=1的队列进行发送:

 

 

 

可以看到queue1中已经收到了消息:

 

 

3.总结

RabbitMQ支持的消息模式:

简单模式 Simple

  • 交换机类型:default
  • 特点:通过默认交换机实现一对一分发

工作模式 Work

  •  交换机类型:default
  • 特点:轮询分发:按均分配;公平分发:按劳分配;

发布订阅模式

  • 交换机类型:fanout
  • 特点:订阅频道,每个队列与交换机绑定,都能收到消息

路由模式

  • 交换机类型:direct
  • 特点:有route key作为标识,发送消息时通过路由key进行一对一发送,实际性能会有所损耗

主题模式

  • 交换机类型:topic
  • 特点:在route key基础上增加了模糊匹配,#:0个或者多个;*:必须有一个

参数模式

  • 交换机类型:headers
  • 特点:携带参数Arguments,实际发送与有对应参数的队列相匹配进行发送

 

posted on 2021-04-16 12:42  人无名,则可专心练剑  阅读(250)  评论(0编辑  收藏  举报