rocketmq的消息可靠性(防止消息丢失)

刘Java 刘Java     2023-01-26     546

关键词:

详细介绍了RocketMQ消息丢失的问题,以及解决办法。

消息的丢失问题,可能出现在生产者、MQ、消费者中。

1 生产者消息丢失

RocketMQ 提供了三种方式发送消息:同步、异步和单向。

同步发送:同步发送指消息发送方调用发出数据接口后会阻塞直到在收到接收方发回响应之后才进行后续的步骤,比如发送下一条消息。一般用于重要通知消息,例如重要通知邮件、营销短信。

异步发送:异步发送指发送方调用发出数据接口后,不等接收方发回响应,接着进行后续的步骤,比如发送下一条消息,一般用于可能链路耗时较长而对响应时间敏感的业务场景,例如用户视频上传后通知启动转码服务。

单向发送:单向发送是指只负责发送消息而不等待服务器回应且没有回调函数触发,适用于某些耗时非常短但对可靠性要求并不高的场景,例如日志收集。

想要生产者消息不丢失,那么只需要在生产者每发送一个消息时,Broker同步返回一个消息发送成功SEND_OK的反馈消息即可,如果发生异常,比如反馈失败或者超时则重试,重试还是不成功的话就先入库,后续再人工处理。注意即使返回SEND_OK也不一定意味着它是可靠的,还应启用同步Master服务器或同步刷盘,即SYNC_MASTER或SYNC_FLUSH,但至少表示Producer端是没问题的。

另一个方法就是使用RocketMQ自带的事务机制来发送消息,即事务消息,这样还能保证生产者事务和消息发送同时成功,但会事务消息更加重量级,还会降低吞吐量。

2 MQ消息丢失

RocketMQ支持消息的高可靠存储,Broker端影响消息可靠性的几种情况:

  1. Broker非正常关闭
  2. Broker异常Crash
  3. OS Crash
  4. 机器掉电,但是能立即恢复供电情况
  5. 机器无法开机(可能是cpu、主板、内存等关键设备损坏)
  6. 磁盘设备损坏

1)、2)、3)、4) 四种情况都属于硬件资源可立即恢复情况,RocketMQ在这四种情况下能保证消息不丢,或者丢失少量数据(依赖刷盘方式是同步还是异步)。

5)、6)属于单点故障,且无法恢复,一旦发生,在此单点上的消息全部丢失。RocketMQ在这两种情况下,通过配置Broker主从可以解决。通过主从异步复制,可保证99%的消息不丢,但是仍然会有极少量的消息可能丢失。通过主从同步双写技术可以完全避免单点,同步双写势必会影响性能,适合对消息可靠性要求极高的场合,例如与Money相关的应用。注:RocketMQ从3.0版本开始支持同步双写。

3 消费者消息丢失

如果消费者拿到了消息还没有开始消费就自动向broker提交了此消息的offset,这会导致mq认为这条消息已经处理过了。此时如果消费者突然宕机了,然而实际并没有处理,重启之后获取的消息中不会包含已提交消息,所以这条消息就丢失掉了。

对于Kafka和RabbitMQ来讲,默认的消费模式就是上边这种自动提交的模式,所以是有可能导致消息丢失掉的,所以其实Consumer的消息丢失解决方案也很简单,就是将自动提交改为手动提交。

而RocketMQ的消费者有点不一样,它本身就是需要手动返回消息处理成功的ack的,对于并行消费需要手动返回ConsumeConcurrentlyStatus.CONSUME_SUCCESS,对于串行消费需要返回ConsumeOrderlyStatus.SUCCESS,因此不需要额外的配置。

另外,如果采用广播模式消费,则需要在客户端维护offset,需要持久化。

相关文章:

RocketMQ

如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!

各种消息队列如何选择?为何选择rocketmq来保证消息不丢失,及应该采用rocketmq哪种通信模式?

前言消息队列本质上来说,是一个符合先进先出原则的单向队列:一方发送消息并存入消息队列尾部(生产者投递消息),一方从消息队列的头部取出消息(消费者消费消息)。 但对于一个成熟可靠的消息队列来说,所需要解决... 查看详情

各种消息队列如何选择?为何选择rocketmq来保证消息不丢失,及应该采用rocketmq哪种通信模式?

前言消息队列本质上来说,是一个符合先进先出原则的单向队列:一方发送消息并存入消息队列尾部(生产者投递消息),一方从消息队列的头部取出消息(消费者消费消息)。 但对于一个成熟可靠的消息队列来说,所需要解决... 查看详情

各种消息队列如何选择?为何选择rocketmq来保证消息不丢失,及应该采用rocketmq哪种通信模式?

前言消息队列本质上来说,是一个符合先进先出原则的单向队列:一方发送消息并存入消息队列尾部(生产者投递消息),一方从消息队列的头部取出消息(消费者消费消息)。 但对于一个成熟可靠的消息队列来说,所需要解决... 查看详情

rocketmq使用之消息保证,重复读,积压,顺序,过滤,延时,事务,死信

...机制,来保证消息的可靠传递。存储阶段,可以通过配置可靠性优先的Broker参数来避免因为宕机丢消息,简单说就是可靠性优先的场景都应该使用同步从Consumer角度分析,如何保证消息被成功消费?Consumer保证消息成功消费的关... 查看详情

rocketmq保证消息不丢失

...cer消息存储在内存中,然后发生宕机,就会导致消息丢失RocketMQ的持久化消息有两种方式:同步刷盘:Broker收到消息后会在持久化到磁盘完成后才发送ack异步刷盘:Broker收到消息存到内存后返回ack,然后Broker定 查看详情

rabbitmq:第二章:spring整合rabbitmq(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失,ttl,死信队列,延迟队列,消息积压,消息幂等性)(代码(代码片段)

...xff0c;广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失, 查看详情

kafka与rocketmq落盘机制比较

...量和稳定性,本期我们要引入一个新的评测标准——软件可靠性。何为“可靠性”?先看下面这种情况:有A,B两辆越野汽车,在城市的周边地区均能很好应对泥泞的路况。当一同开去穿越西藏,A车会因为西藏本地的汽油不达标... 查看详情

浅谈rocketmq如何保证消息不丢失(代码片段)

RocketMQ如何保证消息不丢失?一、明确丢失消息场景二、RocketMQ避免消息丢失解决方案1、消息生产者使用事务消息2、配置同步刷盘+Dledger主从架构3、消息消费者端使用同步消费机制4、设计降级方案MQ如何避免消息不丢失&#x... 查看详情

浅谈rocketmq如何保证消息不丢失(代码片段)

RocketMQ如何保证消息不丢失?一、明确丢失消息场景二、RocketMQ避免消息丢失解决方案1、消息生产者使用事务消息2、配置同步刷盘+Dledger主从架构3、消息消费者端使用同步消费机制4、设计降级方案MQ如何避免消息不丢失&#x... 查看详情

rocketmq原理及解析

1如何保证消息的可靠性传输生产者丢失数据:生产者设置同步提交消息,并且手动提交,将消息同步刷盘到从节点后在返回成功;broker:主从复制,同步刷盘;消费端:消费重试,只有返回consu... 查看详情

27发送消息零丢失方案:rocketmq事务消息的实现流程分析

...常见的网络故障之类的问题,导致消息就丢失了。在RocketMQ中,有这么一个功能,就是事务消息的功能,凭借这个事务级的消息机制,就可以让我们确保订单系统推送出去的消息一定会成功写入MQ里 查看详情

rocketmq的消息刷盘和消息双写

...正返回给Producer端一个成功的ACK响应。同步刷盘对MQ消息可靠性来说是一种不错的保障,但是性能上会有较大影响,一般适用于金融业务应用该模式较多。异步刷盘:能够充分利用OS的PageCache的优势,只要消息写入P... 查看详情

kafkarabbitmqrocketmq等消息中间件的对比——消息发送性能和区别

...是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。RocketMQ是阿里开源的消息中间件,它是纯Ja... 查看详情

mq在高并发环境下,如果队列满了,如何防止消息丢失?

...高并发的问题。性能比较好的消息中间件:Kafka、RabbitMQ,RocketMQ.2、什么情况下会产生消息丢失的现象?消息队列满了的情况下。3、如何解决消息丢失的问题?(1)生产者可以采用重试机制。因为消费者会不停的消费消息,可以... 查看详情

rocketmq和kafka到底选哪个

...约在10万条/秒结论:追求性能方面,kafka单机性能更高3、可靠性kafka使用异步刷盘方式,异步Replicationrocketmq支持异步/同步刷盘,异步/同步Replication结论:rocketmq所支持的同步方式提升了数据的可靠性4、实时性kafka和rocketmq均支持p... 查看详情

怎么做才能不丢消息?

...递的。现在主流的消息队列产品都提供了非常完善的消息可靠性保证机制,可以做到在消息传递的过程中,即使发生网络中断或者硬件故障,也能确保消息的可靠传递、不丢消息。绝大部分丢消息的原因都是由于开发者不熟悉消... 查看详情

rocketmq消息幂等(去重)通用解决方案(代码片段)

点击上方关注“终端研发部”设为“星标”,和你一起掌握更多数据库知识消息中间件是分布式系统常用的组件,无论是异步化、解耦、削峰等都有广泛的应用价值。我们通常会认为,消息中间件是一个可靠的组件—... 查看详情

rocketmq入门到精通—rocketmq初级特性能力|messagereliablity,消息可靠性(不能多也不能丢)如何解决?

...Q入门到精通】​​】RocketMQ支持消息的高可靠,影响消息可靠性的几种情况:Broker非正常关闭Broker异常CrashOSCrash机器掉电,但是能立即恢复供电情况机器无法开机(可能是cpu、主板、内存等关键设备损坏)磁盘设备损坏  ... 查看详情