暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何防止队列消息丢失以及重复消费

这个码农有点帅 2021-06-21
937

    为了满足业务的不断发展长大的需要,我们常引入各种中间件,提高系统的运行效率,提高系统的吞吐率等。本篇文章,将为您介绍在消息中间件的使用中,如何防止消息对接以及重复消费。

1、消息中间件的作用

    削峰填谷、系统解耦、异步处理

2、消息链路分析

    消息中间件一般分为消息生产者和消息消费者,那么消息从生产者生产出来到消息被消费调这个过程中,有哪些地方可能导致消息丢失呢?

  • 消息从生产者写入到消息队列的过程投递失败:


    情景一:消息在传送给消息系统的过程中发生网络问题,数据直接丢失。

    情景二:消息已经到达消息系统,但是在消息系统给生产者服务器返回信息时,因网络问题,此时的数据不一定真正的丢失,很可能只是生产者认为数据丢失。

  • 消息在消息队列中,持久化失败:

    消息系统是可以对消息进行持久化,一般都是将消息存储到本地磁盘中(也有些是持久化到数据库,这会影响消息系统的性能,在此先不做讨论),那种持久化的过程中,可能会因为机器宕机或者突然停电等原因导致消息丢失。

  • 消息被消费者消费的过程出现异常:

    如上图所示,消息消费过程中的三步均有可能因为外部网络问题而导致消息丢失。

3、保证消息不丢失的解决方案

    错误重发机制:当一条消息被生产出来没有明确得到成功的通知时,设置不同定时的继续推送,这很大程度上保证了消息最终不会丢失;

多副本机制:比如kafka,多节点,多副本,不会因为一个节点的问题而导致消息丢失。

4、如何保证消息只被消费一次

    保证消息处理幂等性,实现幂等之后,哪怕同一条消息入队多次,虽然会被多次消费,但因为幂等性,多次操作返回的结果都一样,就相当于只被消费了一次,从而保证数据的一致性。


思考题:

在你的项目中,如何实现消息消费的幂等性?欢迎在下方留言,谈谈你们的解决方案。


文章转载自这个码农有点帅,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论