- 消息中间件的使用场景
① 异步发送(验证码、短信、邮件等)
② MySql、Redis、ES之间的数据同步
③ 分布式事务
④ 削峰填谷
- 消息丢失的情况:

- 生产者发布消息,消息丢失的预防机制:生产者确认机制
RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。消息发送到MQ后,会返回一个结果到生产者,表示消息发送的状态情况。

消息发送失败后的处理方法:
① 回调方法即时重发
② 记录日志
③ 保存数据到数据库然后定时重发,成功发送后即可删除表中的数据
- MQ队列中消息对视的预防机制
MQ是默认内存存储消息,开启持久化功能可以确保缓存再MQ中的消息不丢失。
4.1 交换机持久化

4.2 队列持久化

4.3 消息持久化,SpringAMQP中的消息默认是持久的,可以通过MessageProperties中的DeliveryMode指定

- 消费者确认 保证消费者端消息不丢失
RabbitMQ支持消费者确认机制,即: 消费者处理消息后可以向MQ发送ack回执,MQ收到sck回执后才会删除该消息。而SprinmgAMQP则允许配置三种确认模式:
① manual:手动ack,需要在业务代码结束后,调用api发送sck。
② auto:自动ack,有sping监测listener代码是否出现异常,没有异常则返回ack,异常后则返回nack
③ none:关闭ack,MQ假定消费者获取消息后会成功处理,因此消息投递后立即被删除。
可以使用spring的retry机制,在消费者出现异常时利用本地重试,设置重试次数,当达到次数后,如果消息依然消费失败,则将消息投递给异常交换机,交由人工处理。

- 消息重复消费的出现的出现情况:
① 网络抖动 ② 消费者服务宕机
消费者处理完成消息后,因为上述原因无法正常返回ack回执到MQ,使得MQ中的消息无法正常删除,当消费者服务正常后,该消息又会被消费者重新处理,导致消息重复。
解决方案:
① 为每一条消息设置一个唯一标志ID
② 使用幂等方案(分布式锁、数据库锁),性能较差