【消息队列】4-什么情况下消息会丢失?如何保证消息的可靠性传输?

avatar 2020年11月19日11:15:17 6 3667 views
博主分享免费Java教学视频,B站账号:Java刘哥 ,长期提供技术问题解决、项目定制:本站商品点此

什么情况下会消息丢失?如何保证消息的可靠性?

 

这里以 RocketMQ 来说明,从三个角度来看

先献上一张图,网上找的,侵删

一. 生产者

描述:生产者因为网络原因发送时丢失,

解决办法:

  1. 发送失败重试,生产者发送失败换broker和queue,这是MQ自己帮我们做的,不需要自己编写代码处理
  2. 通过MQ自带事务来编码处理,但是性能会有所下降。具体思想类似两阶段提交:

如下图所示

二. broker

描述:broker自己存储消息数据失败而丢失,或者MQ磁盘损坏但没有副本

解决办法:

  1. 刷盘方式采用同步刷盘,即消息存储成功后才告诉生产者发送成功
  2. 采用集群部署,如多Master多Slave同步模式

 

三. 消费者

描述:消费者消费消息后,还没处理完,就返回消费成功,但是突然消费者挂了,实际消息没有消费但是MQ以为消费了,即消息丢失

解决办法:

  1.  使用同步消费,即消费处理完成后才返回结果

 

四、总结

只要愿意去做,通过修改参数,RocketMQ可以做到消息零丢失,但是性能和吞吐量会有大幅度下降。其他MQ如kafka也是如此。

我们需要根据具体的业务场景来判断是否需要加事务、同步发送、同步消费等。

比较核心的业务通常需要保证消息零丢失,除了通过MQ来做,也可以使用一些定时器去补偿,从而避免数据错误,导致用户利益损失。

像一些场景是允许少量数据丢失的,对MQ的吞吐量要求较高,比如日志采集。

 

 

  • 微信
  • 交流学习,资料分享
  • weinxin
  • 个人淘宝
  • 店铺名:言曌博客咨询部

  • (部分商品未及时上架淘宝)
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0