MQ如何保证消息可靠性
1. 保证生产消息的可靠性
首先在发送消息时可以开启重试机制,避免因为短暂的网络问题导致发送消息失败。 RabbitMQ还提供生产者确认机制保证发送消息到MQ的可靠性。 消息投递成功返回ack,投递失败返回nack。 消息投递成功但路由失败会返回异常信息。 我们在发送消息时给每个消息指定一个唯一ID,设置回调方法,如果Publisher Return失败或Publisher Confirm返回nack,我们在回调方法中解析失败消息,并记录到失败表由定时任务去异步重新发送。
2. 设置消息持久化
设置交换机持久化:将交换机的定义信息(元数据)持久化到RabbitMQ的数据库中 队列持久化:将队列的定义信息(元数据)持久化到RabbitMQ的数据库中 消息持久化:发送消息设置delivery_mode=2,消息进行持久化。
3. 保证消费消息的可靠性
RabbitMQ是通过消费者回执来确认消费者是否成功处理消息的:消费者获取消息后,应该向RabbitMQ发送ACK回执,表明自己已经处理完成消息,RabbitMQ收到ACK后删除消息,在处理失败后向MQ发送NACK那么消息会重新投递到消费者。 RabbitMQ提供三个确认模式:手动ack,自动ack、关闭ack 本项目使用自动ack模式,当消费消息失败会重试,重试3次如果还失败会将消息投递到固定的交换机,通过交换机将消息转发到失败消息队列,程序监听失败消息队列,接收到失败消息,将失败消息存入失败消息表,通过定时任务进行处理。
4. 消息队列无法百分百保证可靠性
消息队列无法百分百保证可靠性,一定要提供补偿机制,比如:支付通知消息发送失败,我们可以在业务层提供支付结果查询接口,由消息消费方调用接口去查询支付结果。 可以百分百保证MQ的消息可靠性吗? 无法保证百分百消息可靠,所以使用MQ是针对那些对数据一致性要不是很高的场景。 当消息出现丢失允许暂时数据不一致最后通过补偿措施保证数据最终一致性即可。