我们为什么需要幂等

幂等(Idempotence)指的是如果我们反复执行一个方法,如果方法的输入不变,那么第一次执行的结果和第n次执行的结果应该是一样的。

在数据处理和计算过程中这是一个非常重要的概念,是确保整个数据处理流程健壮性的关键要素之一,也是保证整个过程可重现可追溯的重要特性。

在现实生活中,也有很多符合幂等特性的例子与场景,比如电梯的楼层按钮,比如路口的行人过街按钮都是幂等的:不论重复执行(按下/点亮)多少次,结果都是固定且稳定的

1 幂等在数据一致性上的重要性

1.1 数据写入

比如我们在数据库具有如下的数据:

idnamescore
1张三95
2李四97

现在需要从数据源同步过来新的数据:

idnamescore
3王五99

我们期望的结果是:

idnamescore
1张三95
2李四97
3王五99

在实际的数据同步过程中,我们通常会需要进行增量同步:

  1. 找到上一次同步的标记位,比如id=2
  2. 基于找到的标记位,写入后续的数据,即id > 2的数据
  3. 更新标记位,id=3

假设在上面的第3步失败了,虽然成功写入了id=3的位置,但是没有成功更新标记位,还是id=2,那么在下次数据同步的时候,会再次尝试写入id=3的数据。

此时,如果我们的处理过程是幂等的,无论执行多少次,只要数据源没有发生变化(一共3条数据),那么结果就都是一样的,还是3行数据。

但是,如果我们的处理过程不是幂等的,那么如果任何一次更新标记位失败了,就有可能产生下面的结果:

idnamescore
1张三95
2李四97
3王五99
3王五99

我们有了两条id=3的数据,这个问题会影响所有相关的查询、分析操作,以及在千万级别的数据量下问题的影响和严重性不可估量。

1.2 API接口的幂等性

互联网业务通常有着高并发和数据一致性的需求,同时有着网络不稳定的客观事实。

这就对接口的幂等性的要求更为迫切:在网络抖动的情况下,如果发生了重复请求,结果要保证稳定。

举个例子,有这样一个接口方法:pay(long ticket, int money),该方法用于银行卡扣款支付,参数ticket为订单编号,money为须要扣除的钱数。当用户从网页上点击支付按钮时,在该方法的实现逻辑中须要从指定帐户中扣除对应的商品价钱。若是支付操做已经成功执行,可是响应消息由于某种缘由未能及时返回给客户端,这时候给用户的体验是多是未支付成功,若是此时再次点击支付按钮,那么将再一次执行该方法,结果可能会致使用户只买了一件商品却花了双份的钱,这固然是不合理的。

1.3 Redux数据状态管理

Redux是十分优秀的数据状态管理框架,能够详细、准确的记录数据状态的每一次变化,并能够保障数据的高度一致性和可溯源的特性。其中的重点之一就是它的reducer方法的幂等性:只要当前状态state和要执行的动作action是固定的,那么新的state的状态一定是确定的,不论执行多少遍。

const reducer = function(state,action){
	return 新的state
}

2 如果没有幂等的后果

在数据处理的场景中,符合幂等特性的处理方式能够保证数据的正确性,比如能够有效防止重复数据的产生,而重复数据和数据不一致的问题在数据分析中会带来各种各样的隐患:

  1. 影响决策与判断:排名,计数,求和,均值,分布都会受到影响
  2. 打断下游处理:任何有依赖id => 内容的一对一关联关系的系统,如果产生了重复数据则可能会导致程序错误或者发生无法预期的行为
  3. 高并发下的数据处理流程如果不满足幂等很可能会带来大量的空间与计算资源的浪费

总之,任何依赖数据做决策的系统和企业,数据的不一致性会导致错误的方向决策,更不用说浪费存储空间和重写查询以补偿重复记录的额外开销成本。

参考材料

  • https://en.wikipedia.org/wiki/Idempotence
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值