网页设计 网站建设啥意思,erp软件实施,可以做热图的工具网站,电子商务网站建设合同签订点戳蓝字“架构之美”关注我们哦#xff01;前言 今天我们聊一个话题#xff0c;这个话题大家可能在面试过程中#xff0c;或者是工作当中经常遇到 ?如何保证 Kafka 消息不重复消费#xff1f;我们在做开发的时候为了程序的健壮性#xff0c;在使用 Kafka 的时候一般都会… 点戳蓝字“架构之美”关注我们哦 前言 今天我们聊一个话题这个话题大家可能在面试过程中或者是工作当中经常遇到 ?如何保证 Kafka 消息不重复消费我们在做开发的时候为了程序的健壮性在使用 Kafka 的时候一般都会设置重试的次数但是因为网络的一些原因设置了重试就有可能导致有些消息重复发送了(当然导致消息重复也有可能是其他原因)那么怎么解决消息重复这个问题呢关于这个问题我这儿提供了如下三种解决方案供大家参考。 解决方案方案一 / 保存并查询给每个消息都设置一个独一无二的 key消费的时候把 key 记录下来然后每次消费新的消息的时候都查询一下看当前消息的这个 key 是否消费过如果没有消费过才进行消费。(这种方式好想但是其实实现起来一点也不简单)方案二 / 利用幂等幂等(Idempotence)在数学上是这样定义的如果一个函数 f(x) 满足f(f(x)) f(x)则函数 f(x) 满足幂等性。这个概念被拓展到计算机领域被用来描述一个操作、方法或者服务。一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。一个幂等的方法使用同样的参数对它进行多次调用和一次调用对系统产生的影响是一样的。所以对于幂等的方法不用担心重复执行会对系统造成任何改变。我们举个例子?来说明一下。在不考虑并发的情况下“将 X 老师的账户余额设置为 100 万元”执行一次后对系统的影响是X 老师的账户余额变成了 100 万元。只要提供的参数 100万元不变那即使再执行多少次X 老师的账户余额始终都是 100万元不会变化这个操作就是一个幂等的操作。再举一个例子?“将 X 老师的余额加 100 万元”这个操作它就不是幂等的每执行一次账户余额就会增加 100 万元执行多次和执行一次对系统的影响(也就是账户的余额)是不一样的。所以通过这两个例子我们可以想到如果系统消费消息的业务逻辑具备幂等性那就不用担心消息重复的问题了因为同一条消息消费一次和消费多次对系统的影响是完全一样的。也就可以认为消费多次等于消费一次。那么如何实现幂等操作呢最好的方式就是从业务逻辑设计上入手将消费的业务逻辑设计成具备幂等性的操作。但是不是所有的业务都能设计成天然幂等的这里就需要一些方法和技巧来实现幂等。下面我们介绍一种常用的方法利用数据库的唯一约束实现幂等。例如我们刚刚提到的那个不具备幂等特性的转账的例子将 X 老师的账户余额加 100 万元。在这个例子中我们可以通过改造业务逻辑让它具备幂等性。首先我们可以限定对于每个转账单每个账户只可以执行一次变更操作在分布式系统中这个限制实现的方法非常多最简单的是我们在数据库中建一张转账流水表这个表有三个字段转账单 ID、账户 ID 和变更金额然后给转账单 ID 和账户 ID 这两个字段联合起来创建一个唯一约束这样对于相同的转账单 ID 和账户 ID表里至多只能存在一条记录。这样我们消费消息的逻辑可以变为“在转账流水表中增加一条转账记录然后再根据转账记录异步操作更新用户余额即可。”在转账流水表增加一条转账记录这个操作中由于我们在这个表中预先定义了“账户 ID 转账单 ID”的唯一约束对于同一个转账单同一个账户只能插入一条记录后续重复的插入操作都会失败这样就实现了一个幂等的操作。方案三 / 设置前置条件为更新的数据设置前置条件另外一种实现幂等的思路是给数据变更设置一个前置条件如果满足条件就更新数据否则拒绝更新数据在更新数据的时候同时变更前置条件中需要判断的数据。这样重复执行这个操作时由于第一次更新数据的时候已经变更了前置条件中需要判断的数据不满足前置条件则不会重复执行更新数据操作。比如刚刚我们说过“将 X 老师的账户的余额增加 100 万元”这个操作并不满足幂等性我们可以把这个操作加上一个前置条件变为“如果X老师的账户当前的余额为 500万元将余额加 100万元”这个操作就具备了幂等性。对应到消息队列中的使用时可以在发消息时在消息体中带上当前的余额在消费的时候进行判断数据库中当前余额是否与消息中的余额相等只有相等才执行变更操作。但是如果我们要更新的数据不是数值或者我们要做一个比较复杂的更新操作怎么办用什么作为前置判断条件呢更加通用的方法是给你的数据增加一个版本号属性每次更数据前比较当前数据的版本号是否和消息中的版本号一致如果不一致就拒绝更新数据更新数据的同时将版本号 1一样可以实现幂等。 最后今天给大家提供的消息重复的解决方案也参考了《消息队列高手课》里的思路大家如果有什么好的解决方案欢迎讨论大家加油·end·奈学教育科技技术人成长之路的指路人点赞支持技术创业?