内容简介:解决方案
戳蓝字“架构之美”关注我们哦!
前言
今天我们聊一个话题,这个话题大家可能在面试过程中,或者是工作当中经常遇到 :point_right: 如何保证 Kafka 消息不重复消费? 我们在做开发的时候为了程序的健壮性,在使用 Kafka 的时候一般都会设置重试的次数,但是因为网络的一些原因,设置了重试就有可能导致有些消息重复发送了(当然导致消息重复也有可能是其他原因),那么怎么解决消息重复这个问题呢?
关于这个问题,我这儿提供了如下三种解决方案,供大家参考。
解决方案
方案一 / 保存并查询
给每个消息都设置一个独一无二的 key,消费的时候把 key 记录下来,然后每次消费新的消息的时候都查询一下,看当前消息的这个 key 是否消费过,如果没有消费过才进行消费。(这种方式好想,但是其实实现起来一点也不简单)
方案二 / 利用幂等
幂等(Idempotence) 在数学上是这样定义的,如果一个函数 f(x) 满足:f(f(x)) = f(x),则函数 f(x) 满足幂等性。
这个概念被拓展到计算机领域,被用来描述一个操作、方法或者服务。一个幂等操作的特点是, 其任意多次执行所产生的影响均与一次执行的影响相同 。一个幂等的方法,使用同样的参数,对它进行多次调用和一次调用,对系统产生的影响是一样的。 所 以,对于幂等的方法,不用担心重复执行会对系统造 成任何改变。
我们举个例子 :chestnut: 来说明一下。 在不考虑并发的情况下,“将 X 老 师的 账户余额设置为 100 万元”,执行一次后对系统的影响是,X 老师的账户余额变成了 100 万元。 只要提供的参数 100万元不变,那即使再执行多少次,X 老师的账户余额始终都是 100万元,不会变化,这个操作就是一个幂 等的操作。
再举一个例子 :chestnut: ,“将 X 老师的余额加 100 万元”,这个操作它就不是幂等的,每执行一次,账户余额就会增加 100 万元,执行多次和执行一次对系统的影响(也就是账户的余额)是不一样的。
所以,通过这两个例子,我们可以想到如果系统消费消息的业务逻辑具备幂等性,那就不用担心消息重复的问题了,因为同一条消息,消费一次和消费多次对系统的影响是完全一样的。 也就可以认为,消费多次等于消费一次。
那么,如何实现幂等操作呢? 最好的方式就是,从业务逻辑设计上入手,将消费的业务逻辑设计成具备幂等性的操作 。 但是,不是所有的业务都能设计成天然幂等的,这里就需要一些方法和技巧来实现幂等。
下面我们介绍一种常用的方法: 利用数据库的唯一约束实现幂等 。
例如,我们刚刚提到的那个不具备幂等特性的转账的例子: 将 X 老师的账户余额加 100 万元。 在这个例子中,我们可以通过改造业务逻辑,让它具备幂等性。
首先,我们可以限定,对于每个转账单每个账户只可以执行一次变更操作,在分布式系统中,这个限制实现的方法非常多,最简单的是我们在数据库中建一张转账流水表,这个表有三个字段: 转账单 ID、账户 ID 和变更金额,然后给转账单 ID 和账户 ID 这两个字段联合起来创建一个唯一约束,这样对于相同的转账单 ID 和账户 ID,表里至多只能存在一条记录。
这样,我们消费消息的逻辑可以变为: “在转账流水表中增加一条转账记录,然后再根据转账记录,异步操作更新用户余额即可。 ”在转账流水表增加一条转账记录这个操作中,由于我们在这个表中预先定义了“账户 ID 转账单 ID”的唯一约束,对于同一个转账单同一个账户只能插入一条记录,后续重复的插入操作都会失败,这样就实现了一个幂等的操作。
方案三 / 设置前置条件
为更新的数据设置前置条件另外一种实现幂等的思路是, 给数据变更设置一个前置条件 ,如果满足条件就更新数据,否则拒绝更新数据,在更新数据的时候,同时变更前置条件中需要判断的数据。
这样,重复执行这个操作时,由于第一次更新数据的时候已经变更了前置条件中需要判断 的数据,不满足前置条件,则不会重复执行更新数据操作。
比如,刚刚我们说过,“将 X 老师的账户的余额增加 100 万元”这个操作并不满足幂等性,我们可以把这个操作加上一个前置条件,变为: “如果X老师的账户当前的余额为 500万元,将余额加 100万元”,这个操作就具备了幂等性。
对应到消息队列中的使用时,可以在发消息时在消息体中带上当前的余额,在消费的时候进行判断数据库中,当前余额是否与消息中的余额相等,只有相等才执行变更操作。
但是,如果我们要更新的数据不是数值,或者我们要做一个比较复杂的更新操作怎么办? 用什么作为前置判断条件呢? 更加通用的方法是,给你的数据增加一个版本号属性,每次更数据前,比较当前数据的版本号是否和消息中的版本号一致 ,如果不一致就拒绝更新数据,更新数据的同时将版本号 +1,一样可以实现幂等。
最后
今天给大家提供的消息重复的解决方案,也参考了《消息队列高手课》里的思路,大家如果有什么好的解决方案,欢迎讨论!!
大家加油!!
·end·
奈学教育科技
技术人成长之路的指路人
点赞支持技术创业 :point_down:
以上所述就是小编给大家介绍的《什么?搞不定Kafka重复消费?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 消费端如何保证消息队列MQ的有序消费
- 《吊打面试官》系列-分布式事务、重复消费、顺序消费
- 十一贝:航延险智能判定,公平消费环境惠及消费者
- Kafka消费者的偏移量和高级/简单消费者
- RocketMQ 实战:一个新的消费组初次启动时从何处开始消费呢?
- RocketMQ的消费模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
刘大猫的财富之旅
刘欣、刘大猫 / 新华出版社 / 2017-7-21 / 58.00元
作者刘大猫是一名90后的互联网连环创业者,26岁的他通过互联网创业收获到了财富,不仅仅是物质财富,还有认知的财富。 与其他创业类书籍不通的是,这本书非常真实,务实。书中没有任何大道理鸡汤,作者用平实的语言记录了创业以来遇到的种种事情,变化,困境,以及阶段性的成绩,记录了作者务实,鲜活的创业青春。一起来看看 《刘大猫的财富之旅》 这本书的介绍吧!