RabbitMQ消息模式
各个模式相关代码及笔记md已汇总至gitHub专区:
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 。业务处理逻辑使用另一个线程从内存中读取数据,这样可以将应用进一步解稿,提高整个应用的处理效率。
详细的执行流程过程涉及到的底层通信原理比较复杂,有兴趣的可以了解另一篇博文,写的非常详细,这里就不再做过多地阐述:
2.RabbitMQ支持的消息模式
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,实际发送与有对应参数的队列相匹配进行发送
作者:人无名,则可专心练剑
原文出处:https://www.cnblogs.com/yif0118/p/14664154.html
共同学习,写下你的评论
评论加载中...
作者其他优质文章