介绍
rabbitmq性能(1.2w+)高于activemq(6000+),低于rocketmq(10w+),通讯协议默认为amqp,通过插件扩展可支持stomp/mqtt等协议。
概念
连接
tcp连接
信道
tcp上封装的虚拟连接,每个线程对应一个信道,即多路复用
生产者
消费者
消息
包括标签(消息头)和有效载荷(消息体)
交换器exchange
交换器直接与生产者交互,解耦生产者与队列,队列通过路由键绑定到交换器,本质为路由查询表
交换器类型
- direct:1对1映射完全匹配交换器和队列,默认交换器类型,默认以队列名称作为路由键
- fanout:广播模式,忽略路由键配置,生产者发送的消息将由交换器发到所有与该交换器绑定的队列(绑定了其他交换器的队列并不会收到消息)
- topic:通配符模式,根据路由键中的通配符决定将消息发到符合条件的queue,通配符*表示匹配一个字符,#表示匹配一个或多个字符,.表示匹配分割符,如test.#,可以匹配test.开头的所有路由键
- headers:通过报文头中的自定义的键值对来确定消息存到哪个queue,实操中因为功能与direct雷同且性能较差,几乎不用
队列queue
消息存储位置,直接与消费者交互,一个队列可以有多个消费者
路由键
即交换器与队列的映射,队列可绑定多个路由键
虚拟主机vhost
可以隔离mq所有资源,有自己的权限,类比于命名空间
生产消费机制
生产消息
生产消息可以选择模式,如下
- 无模式:即生产者将消息发给mq后就算结束,不关心消息是否已经落到queue中。
- 失败确认:开启故障检测模式,设置mandatory,特点是只有当消息没有落到queue中时会反馈给生产者,包括队列不存在/路由没有找到等情况。但是此种模式对于数据完整性来说有缺陷,无法保证反馈通知一定能通知到生产者(如此时生产者挂了),也就可能产生消息丢失的情况。
- 事务:性能太差
- 发送方确认模式:将信道设置为confirm模式,同事务模式冲突,可以与失败确认组合使用,其中又可以分为三种
- 同步确认:即发送完后同步等待消息确认
- 批量确认:发送批量消息后同步等待确认,仅会对整批消息返回一条确认消息,失败则意味着这批消息需要重发
- 异步确认:即发送完后异步等待消息确认,通过先从信道中获取消息发送序号存储,等待消息落到queue中后,mq会通知生产者,此时可以将存储的序号删除,表示成功。
备用交换器
当主交换器无法路由到对应的queue时,将通过备用交换器进行路由,如设置了失败确认模式,会在备用交换器也失败的情况下才通知。
消息过期
主要有2种,
- queue设置过期时间,x-message-ttl 参数,RabbitMQ保证死消息(在队列中的时间超过设定的TTL时间)不会被消费者获得,同时会尽快删除死的消费者。消息不会在消费者的缓冲区中过期,也就是说,只要队列在消息过期前将消息推送给消费者,消费者就一定能处理到这条消息。重新入队(例如被取消确认或者信道关闭或拒绝并重新入队)的消息的过期时间保留初始值,即不刷新过期时间。
- 单条记录设置过期时间,只对处于队头的消息判断是否过期(即不会扫描队列),所以,很可能队列中已存在死消息,但是队列并不知情。这会影响队列统计数据的正确性,妨碍队列及时释放资源。
消费消息
拉取get
即为轮询模式,当没有消息时返回空回复
推送consume
常见使用方式,即mq有消息时主动推送给消费者
消息应答模式
与生产者的确认模式类似,消费者需要告诉mq消息是否已正确消费,目的是确保消息的完整性。主要有有种模式
- 自动确认:autoAck=true,即收到消息就自动确认
- 手动确认:mq会等待消费者返回ack信号后才删除消息,在未收到ack时,消息处于正在消费阶段,其他消费者无法消费到,只有当此消费者与mq断开连接后(如果连接没断,mq允许消费者一直处理该条消息),mq认为此消息没有被消费,将重新投递给消费者。对于某些无法处理的消息,可以在消费者进行拒绝处理,此时该消息可以进入死信队列,等待后续处理。
消息拒绝
消息拒绝有两种方式,
- reject:可以使用requeue标识,=false则不重新发送(可进入死信队列),=true则mq会重新投递消息
- Nack:同reject,可以一次拒绝多个消息
死信交换器
概念同普通交换器没有区别,只不过特意标识为用来处理‘死了的’消息,设置参数为x-dead-letter-exchange。使用场景主要为2种,对异常消息进行后续处理(如人工介入等),可以实现延时处理消息的能力(如实现下单待付款到时间关闭)
和备用交换器的区别
- 备用交换器是主交换器无法路由消息,那么消息将被路由到这个新的备用交换器,而死信交换器则是接收过期或者被拒绝的消息。
- 备用交换器是在声明主交换器时发生联系,而死信交换器则声明队列时发生联系。
场景分析:备用交换器一般是用于生产者生产消息时,确保消息可以尽量进入 RabbitMQ,而死信交换器主要是用于消费者消费消息的万不一失性的场 景(比如消息过期,队列满了,消息拒绝且不重新投递)
触发时机
- 消 息被拒绝且requeue=false
- 消息过期(默认queue是不会过期,可以设置队列过期或单条消息过期)
- 队列达到最大值(默认无限长度)
队列高可用
队列属性配置
参考
https://www.liangzl.com/get-article-detail-6832.html
https://blog.csdn.net/weixin_39776991/article/details/111618735