如何保证消息的可靠性,避免消息丢失

简介: 如何保证消息的可靠性,避免消息丢失

出现消息丢失的情况有三种:

(1)生产者把消息发送到 RabbitMQ Server 的过程中丢失

(2)RabbitMQ Server 收到消息后再持久化之前宕机导致消息 丢失

(3)消费端收到消息还没来得及处理,此时宕机,导致 RabbitMQ Server 认为这个消息已签收,无法重复投递导致消息丢失

 

所以我认为保证消息可靠性从 生产者、MQ、消费者中这三个方面着手就可以了

解决方案:

 

从生产者发送消息到 Server 端的角度:RabbitMQ 提供了事务(transaction)和确认(confirm)两种模式来确保生产者不丢消息。

(1)开启事务 channel.txSelect (),然后发送消息,如果发送过程中出现什么异常,事务就会回滚 channel.txRollback (),如果发送成功则提交事务 channel.txCommit (),但是这种方式是同步的,会导致吞吐量下降;

(2)confirm 确认模式:RabbitMQ 提供了一个 Confirm 消息确认机制,消息从生产者发送到 Server 端以后,如果消息处理成功,Server 端会返回一个 ack 的消息,那么客户端可以根据消息的处理结果,来决定是否要对消息进行重新发送,从而确保消息发送到 Server 端上。

 

从 RabbitMQ Server 端的角度:可以开启消息的持久化机制,也就是收到消息之后持久化到磁盘里面。设置持久化的方式有两个步骤:

(1)创建 Queue 的时候设置为持久化

(2)发送消息的时候,把消息投递模式设置为持久化投递。

 

不过虽然设置了持久化消息,但是有可能也会出现问题,比如消息刷新到磁盘之前,RabbitMQ 的 Server 端宕机,导致消息丢失的一个问题。所以为了确保万无一失,我们需要结合 Confirm 消息确认机制来一起使用。

 

从消费端的角度:我们可以把消息的自动确认机制修改为手动确认,也就是消费端只有手动调用消息确认方法,才表示这个消息已经被签收。

这种方式可能会造成消息的重复消费的问题,这里需要考虑到幂等性的一个设计。

 

以上就是我对保证消息的可靠性的全部理解。

 

image.png


  • 生产者提交给消息服务器时,使用确认机制
  • 消息服务器对应的队列、交换机等都持久化,保证数据的不丢失
  • 消费者关闭 RabbitMQ 自动 ACK,采用消息确认机制,保证数据的不丢失
相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
消息中间件 安全 Java
【RabbitMQ高级篇】消息可靠性问题
【RabbitMQ高级篇】消息可靠性问题
532 0
|
消息中间件 Java 中间件
MQ四兄弟:如何保证消息可靠性
本文介绍了RabbitMQ、RocketMQ、Kafka和Pulsar四种消息中间件的可靠性机制。这些中间件通过以下几种方式确保消息的可靠传输:1. 消息持久化,确保消息在重启后不会丢失;2. 确认机制,保证消息从生产者到消费者都被成功处理;3. 重试机制,处理失败后的重试;4. 死信队列,处理无法消费的消息。每种中间件的具体实现略有不同,但核心思想相似,都是从生产者、中间件本身和消费者三个角度来保障消息的可靠性。
828 0
|
人工智能 编解码
ReCamMaster:视频运镜AI革命!单镜头秒变多机位,AI重渲染颠覆创作
ReCamMaster 是由浙江大学与快手科技联合推出的视频重渲染框架,能够根据用户指定的相机轨迹重新生成视频内容,广泛应用于视频创作、后期制作、教育等领域,提升创作自由度和质量。
994 0
|
消息中间件 数据库
如何保证消息的可靠性?可以百分百保证MQ的消息可靠性吗?
如何保证消息的可靠性?可以百分百保证MQ的消息可靠性吗?
|
Java Nacos Sentinel
Spring Cloud Alibaba 面试题及答案整理,最新面试题
Spring Cloud Alibaba 面试题及答案整理,最新面试题
2471 0
|
存储 Nacos 网络架构
Nacos是如何工作的
Nacos是如何工作的
665 1
|
消息中间件 运维 UED
消息队列运维实战:攻克消息丢失、重复与积压难题
消息队列(MQ)作为分布式系统中的核心组件,承担着解耦、异步处理和流量削峰等功能。然而,在实际应用中,消息丢失、重复和积压等问题时有发生,严重影响系统的稳定性和数据的一致性。本文将深入探讨这些问题的成因及其解决方案,帮助您在运维过程中有效应对这些挑战。
536 1
|
前端开发 JavaScript API
前端框架新探索:Svelte在构建高性能Web应用中的优势
【10月更文挑战第26天】近年来,前端技术飞速发展,Svelte凭借独特的编译时优化和简洁的API设计,成为构建高性能Web应用的优选。本文介绍Svelte的特点和优势,包括编译而非虚拟DOM、组件化开发、状态管理及响应式更新机制,并通过示例代码展示其使用方法。
499 2
|
存储 XML 算法
kvm虚拟机磁盘使用luks加密
kvm虚拟机磁盘使用luks加密
kvm虚拟机磁盘使用luks加密
|
存储 C语言
C语言详解双向链表的基本操作
C语言详解双向链表的基本操作
479 0