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

详细介绍了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学习博客!

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
RocketMQ 是一个开源的分布式消息队列系统,它支持可靠消息传输和最终一致性。 RocketMQ 的可靠消息传输是通过消息的持久化和复制来实现的。当生产者发送消息时,消息会被持久化到本地磁盘,并且会根据配置的复制因子将消息复制到其他的 Broker 节点上。这样即使某个 Broker 节点出现故障,消息仍然可以从其他节点获取。 RocketMQ 通过使用主题(Topic)和分区(Partition)的概念来实现消息的负载均衡和扩展性。一个主题可以由多个分区组成,每个分区可以在不同的 Broker 节点上存储。这样可以保证同一个主题的消息在多个节点上进行分布式存储,提高了系统的可靠性和可扩展性。 最终一致性是指当消息被消费者消费后,消息队列系统会保证所有消费者看到的消息顺序是一致的。RocketMQ 使用了消息消费者组(Consumer Group)的概念,每个消费者组内的消费者共同消费一个主题的消息,系统会确保每个消费者按照相同的顺序消费消息。 此外,RocketMQ 还提供了事务消息和顺序消息等特性来满足不同业务场景下的需求,进一步提高了消息传输的可靠性和一致性。 总结来说,RocketMQ 通过持久化、复制、负载均衡、分区和消费者组等机制来实现可靠消息传输和最终一致性。这使得 RocketMQ 在分布式系统中被广泛应用于解决可靠消息传输的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值