MQ概述
消息队列,是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通讯。
MQ的优势和劣势
优势
- 应用解耦
- 系统的耦合性越高,容错性就越低,可维护性就越低
- 异步提速
- 削峰填谷
劣势
- 系统可用性降低
- 系统复杂提高
- 一致性问题
工作类型
官方文档:https://www.rabbitmq.com/getstarted.html
操作流程
- 创建链接工厂
- 设置参数
- 创建链接 connection
- 创建通道 channel
- 创建交换机 Exchange
- 创建队列 Queue
- 绑定交换机
- 发送消息
- 释放资源
高级特性
消息的可靠性
MQ的投递流程
生产者 -------> mq代理 ---------> 交换机 ---------> 队列 ----------> 消费者
confirm 确认模式
- 消息从 producer 到exchange 则会返回一个 confirmCallback。
return 退回模式
-
消息从 exchange 到 queue 投递失败会返回一个returnCallback。
img.png
消费端可靠性
Consumer Ack
表示消费端收到消息后的确认方式
- 自动确认: acknowledge=“none”
-
手动确认:acknowledge = “manual”
img_1.png
消费端限流
确保ack机制为手动确认
- listener-container 配置属性
- perfetch = 1, 表示消费端每次从mq拉去一条消息来消费,知道手动确认消费完毕后,才会拉取吓一条消息。
- 手动签收
TTL(存活时间/过期时间)
- 当消息到达存活时间后,还没有被消费,会被自动清除
- 可以对消息设置过期时间,也可以对队列设置过期时间
死信队列
死信交换机。当消息死信之后可以重新发送到另外的交换机,这个交换机就叫死信交换机
消息在什么时候会成为死信?
- 队列消息长度达到限制
- 消费者拒收消费信息,basicNack/BasicReject,并且不把消息重新放入原目标队列,requeue=false
- 原队列存在消息过期设置,消息到达时间未被消费
队列绑定死信交换机?
给队列设置参数:x-dead-letter-exchange he x-dead-letter-routing-key
延迟队列
- 消息进入队列后不会立即被消费,只有到达指定时间后才会被消费。
- TTL+死信队列实现延迟队列的效果
应用问题
消息补偿方案

img_2.png

