项目中是如何保证消息的可靠性的:
- 生产者确认机制
- mq持久化
- 消费者确认机制
- 失败重试机制
1.生产者的确认机制:
在发送消息的时候给消息指定一个唯一标识id。消息发送到Mq以后,会返回一个结果给发送者,表示消息是否处理成功,返回ack确认字符
2.mq的持久化
生产者确认可以确保消息投递到RabbitMQ的队列中,但是消息发送到RabbitMQ以后,如果突然宕机,也可能导致消息丢失。
队列,交换机,以及消息都要进行持久化
要想确保消息在RabbitMQ中安全保存,必须开启消息持久化机制。
Mq就是持久化的,持久化到硬盘中的
- 消费者确认机制
三种确认机制:
acknowledge-mode : 三种机制
//项目中使用地是Auto模式,manual太麻烦了// 俩者都不会造成消息丢失
但是会无限重试;消费者一直消费,mq压力特别大
4.消费者重试机制
但是这样消息还是会被丢失!!
还有一个限制最大时间的参数:
允许等待的最大时间,默认是50秒
最后一个参数:有事务为false,没有事务返回true
4.2 失败策略:
默认是直接丢失:
消息转换器,消息失败后 将消息投递到异常交换机中,交给人工处理
或者堆积在死信交换机里
死信交换机
什么是死信交换机:
- 消费者使用basic.reject或 basic.nack声明消费失败,并且消息的requeue参数设置为false(重入队列被设置为false)
- 消息是一个过期消息,超时无人消费
- 要投递的队列消息满了,无法投递
也可以在重试次数过后放入死信交换机
死信交换机用作于延时队列中(延时消费的效果)