首页 > 其他分享 >如何保证RocketMQ消息不丢失

如何保证RocketMQ消息不丢失

时间:2024-11-27 17:35:04浏览次数:8  
标签:Broker 发送 Master 丢失 保证 刷盘 RocketMQ 消息

如何保证RocketMQ消息不丢失

目录

背景

在金融系统中MQ消息的消息丢失是不允许的,消息的丢失会导致支付状态订单状态出现混乱。接下来聊一下如何保证MQ消息不丢失,以笔者公司使用的RocketMQ为例。

什么情况下RokectMQ消息会丢失

MQ的消息生成到消费主要经历三个阶段:生产者发送消息、Broker存储消息、消费者消息对应的消息。如下图:

从上图可以知道消息丢失主要会发生在下面几个地方:

  • 消息生产者将消息发送到RocketMQ Broker的这个过程可能出现消息丢失。
  • RocketMQ Broker接收到生产者发送的消息存储的过程消息可能丢失。
  • 消费者处理失败,但是将错误进行捕捉,导致消息出现虚假的消费成功。实际上没有消费成功,但是在MQ看来消费完成了消费。

解决RocketMQ消息丢失问题

下面会针对于上述过程中可能丢失的问题给与解决。

消息生产防止消息丢失

RocketMQ消息生产方式有三种:同步发送消息、异步发送消息、One-Way发送消息。不同的发送方式试用不同的场景:

同步发送消息: 重要的通知(订单状态的更新)、短信系统。

异步发送消息: 通常用于响应时间敏感的业务场景。

One-way: 主要用于对可靠性要求不高的场景,在金融的场景下不适用。一般是用于日志收集

1、 所以如果你的系统对消息丢失零容忍不能使用 one-way 的方式发送,因为one-way 的消息发送模式本身就是不对消息的不丢失无法保证;

2、同步发送消息和异步发送消息 都可以判断消息的发送状态判断消息是否已经发送到Broker。这里是选择同步发送还是异步发送消息看业务的需要,同步发送比较关心发送后返回的结果,对时间的要求不是那么敏感。异步发送对消息返回时间敏感。

下面找了一个图来进行描述:

下面来对SendResult着重进行说明(来自RocketMQ官方):

  • SEND_OK
    消息发送成功。要注意的是消息发送成功也不意味着它是可靠的。要确保不会丢失任何消息,还应启用同步Master服务器或同步刷盘,即SYNC_MASTER或SYNC_FLUSH。
  • FLUSH_DISK_TIMEOUT
    消息发送成功但是服务器刷盘超时。此时消息已经进入服务器队列(内存),只有服务器宕机,消息才会丢失。消息存储配置参数中可以设置刷盘方式和同步刷盘时间长度,如果Broker服务器设置了刷盘方式为同步刷盘,即FlushDiskType=SYNC_FLUSH(默认为异步刷盘方式),当Broker服务器未在同步刷盘时间内(默认为5s)完成刷盘,则将返回该状态——刷盘超时。
  • FLUSH_SLAVE_TIMEOUT
    消息发送成功,但是服务器同步到Slave时超时。此时消息已经进入服务器队列,只有服务器宕机,消息才会丢失。如果Broker服务器的角色是同步Master,即SYNC_MASTER(默认是异步Master即ASYNC_MASTER),并且从Broker服务器未在同步刷盘时间(默认为5秒)内完成与主服务器的同步,则将返回该状态——数据同步到Slave服务器超时。
  • SLAVE_NOT_AVAILABLE
    消息发送成功,但是此时Slave不可用。如果Broker服务器的角色是同步Master,即SYNC_MASTER(默认是异步Master服务器即ASYNC_MASTER),但没有配置slave Broker服务器,则将返回该状态——无Slave服务器可用。

Broker端消息丢失

首先了解一下Broker集群部署模式(官方方案)。

  • 单Master模式

这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用。不建议线上环境使用,可以用于本地测试。

  • 多Master模式

一个集群无Slave,全是Master,例如2个Master或者3个Master,这种模式的优缺点如下:

  • 优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢),性能最高;

  • 缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到影响。

  • 多Master多Slave模式-异步复制

每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级),这种模式的优缺点如下

  • 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样;

  • 缺点:Master宕机,磁盘损坏情况下会丢失少量消息(非同步刷盘的情况下)

  • 多Master多Slave模式-同步双写

每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功,这种模式的优缺点如下:

  • 优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高;
  • 缺点:性能比异步复制模式略低(大约低10%左右),发送单个消息的RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机

如果是想不存在消息丢失的情况,那么在多Master的情况下要配置消息同步刷盘,而在 多Master多Slave模式-同步双写 的情况下配置同步刷盘。

消费端处理消息

在处理消息的时候,如果消息处理失败返回的状态不应该是ConsumeConcurrentlyStatus.CONSUME_SUCCESS 。如果消息处理失败返回的是ConsumeConcurrentlyStatus.CONSUME_SUCCESS 消息就不能再次被消息。在Broker看来就是已经消费完成。

所以要针对消息处理一定要严谨。

总结

MQ消息的丢失主要发生在发送、存储、消费消息的三个阶段,所以需要防止消息丢失也要从这三个方面着手。

  • 发送消息使用同步或者异步的方式,然后根据返回的 SendResult 来判断是否发送成功
  • Broker的刷盘方式配置成同步刷盘
  • 消息消息失败根据业务需要来判断是否需要重新消费消息。

标签:Broker,发送,Master,丢失,保证,刷盘,RocketMQ,消息
From: https://www.cnblogs.com/likeguang/p/18572722

相关文章

  • 《荒野大镖客2》运行时弹窗“由于找不到vcruntime140.dll,无法继续执行代码”是什么原
    《荒野大镖客2》运行时弹窗“由于找不到vcruntime140.dll,无法继续执行代码”的原因及解决办法对于《荒野大镖客2》玩家来说,在享受游戏时突然遇到弹窗提示“由于找不到vcruntime140.dll,无法继续执行代码”,这无疑是一个令人头疼的问题。这个错误提示通常意味着系统缺少一个关键......
  • RocketMq学习(一)
    一、RocketMQ介绍MQ:消息中间件是什么?消息中间件属于分布式系统中一个子系统,关注于数据的发送和接收,利用高效可靠的异步消息传递机制对分布式系统中的其余各个子系统进行集成。消息队列RocketMQ是阿里巴巴集团基于高可用分布式集群技术,自主研发的云正式商用的专业消息中间......
  • 网易面试:说说 HTTPS 原理?HTTPS 如何保证 数据安全?
    本文原文链接文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完......
  • 如何安全高效地打开和管理动态链接库(DLL)?系统提示dll丢失问题的多种有效修复指南
    动态链接库(DLL)文件是Windows操作系统中非常重要的一部分,它们包含了程序运行所需的代码和数据。当系统提示DLL文件丢失时,可能会导致应用程序无法正常运行。以下是一些安全高效地打开和管理DLL文件以及修复DLL丢失问题的方法:一、安全高效地打开和管理DLL文件1.使用合法渠道获......
  • MySQL误删表数据,如何快速恢复丢失的数据?
    第一步:登录数据库cd/www/server/mysql/binmysql-uroot-p第二步:查看binlog日志是否打开showvariableslike'log_%'; 查看下binlog日志列表binlog日志文件目录在/www/server/data目录下showmasterlogs; 下载生成sql文件/www/server/mysql/bin/mysq......
  • Windows11系统dsound.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个dsound.dll文件(挑选合适的版本文件)把它放......
  • 第55篇 如何保证接口的幂等性问题
    1.接口幂等性定义接口幂等性这一概念源于数学,原意是指一个操作如果连续执行多次所产生的结果与仅执行一次的效果相同,那么我们就称这个操作是幂等的。在互联网领域,特别是在Web服务、API设计和分布式系统中,接口幂等性具有非常重要的意义。具体到HTTP接口或者服务间的API调用,接口幂......
  • RabbitMQ---如何保证MQ幂等性?
    保证MQ幂等性通常是指保证消费者消费消息的幂等性。1、使用数据库的唯一约束去控制。添加唯一索引保证添加数据的幂等性。例如,对于订单处理场景,将订单号设置为唯一约束。当重复插入具有相同订单号的订单记录时,数据库会抛出异常,从而保证幂等性2、使用token机制总结:发送......
  • 彻底理解如何保证Redis和数据库数据一致性问题
    一.背景系统中缓存最常用的策略是:服务端需要同时维护DB和Cache并且是以DB的结果为准,那么就可能出现DB和Cache数据不一致的问题。二.读数据逻辑如下:当客户端发起查询数据的请求,首先回去Redis中查看没有没该数据,有就返回,没有的话就需要去数据库中查询该数据,并......
  • Accessibility.dll文件丢失导致程序无法运行问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个Accessibility.dll文件(挑选合适的版本文件)......