稳定性三十六计-幂等设计

引子

群里发了一个总共1千元的拼手气红包,共10个。静儿点进去,额,抢到了0.05元。这个不甘心啊。退出来重新打开了这个红包,你猜怎样?显示我抢到了0.05元!

这就是幂等(idempotence),不管多少次请求某一个资源,对资源都具有相同的影响。幂等性是系统的接口对外一种承诺,承诺只要调用接口成功,外部多次调用对系统只产生一次副作用。

为什么要幂等

世界上最遥远的距离是我终于鼓起勇气,对着马路对面的你大喊:“你愿意娶我吗?”我看到你面带灿烂的笑容,正回答的时候……一辆大卡车驶过,你的回答我没有听见。

因各种不可抗因素产生的没有收到响应,一个简单有效的方法就是重试。被重试的接口必须是幂等的。

幂等性是分布式系统设计中的一个重要概念,对超时处理、系统恢复等具有重要意义。

保证幂等的手段

保证幂等需要理清楚两件事情:幂等条件和期望结果。

大家可能听说过保证幂等的手段有token令牌、分布式锁、去重表、数据库唯一索引等。这些所谓的幂等手段实际上防重手段。防重本质是防止一个相同的请求被当成多个不同的请求来处理。幂等的条件是知道这是一个相同的请求。防重和幂等本质上是两个不同的阶段。

状态机幂等

在支付场景中,创建了一个支付订单,发起了一个支付请求,这个订单不论多少次重复请求,都应该保证最多只扣款一次。即

相同支付订单ID(幂等条件) —> 最多一次扣款(期望结果)

为了实现这个目标,可以考虑使用有限状态机。

有限状态机(Finite-state machine FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。用于处理复杂的状态转换。

在这个支付的例子中,为了化简,不考虑退款、取消订单等复杂的状态,只考虑未支付和已支付两种状态之间的转换。

由上面的状态转换图可以看到,相同支付订单ID从未支付状态,要不就是支付不成功停留在未支付状态,要不就是支付成功,状态转移为已支付。此状态转移过程不可逆。

public enum OrderStateEnum {    UNPAID {        @Override        public OrderStateEnum changeState() {            if (doPay()) {                return PAID;            }            return UNPAID;        }    },    PAID {        @Override        public OrderStateEnum changeState() {            return PAID;        }    };    public abstract OrderStateEnum changeState();    public boolean doPay() {        //这里是逻辑伪代码,可以是发起下游调用请求支付通道等        return true;    }}

这是一个java版本的简单状态机实现。状态机里定义了一个未支付状态和其行为changeState。changeState又定义了一个未支付状态和其行为changeState。

利用状态机来实现这个幂等支付请求的设计流程图如下:

参考状态机实现和上图可知,相同支付ID的请求,支付状态只能进行一次从未支付到已支付的转换。从而保证了其幂等性。

按目标幂等

先来回答一个小学生的问题:

定了一个会议,参加人数为10人。发现会议室的椅子只有5把。3个提前来到会议室的同学热心的去其他地方搬椅子进来。问:每人要搬几把椅子?

有人要说这不是把简单的问题复杂了吗?大家看到椅子不够就去搬,看够10把椅子了就不搬就可以了。对了,这其实是一个很好的解题思路,完全可以用在设计当中,就是按目标幂等。

相同会议ID(幂等条件) —> 总数10把椅子(期望结果)

利用按目标幂等来实现这个总数10把椅子请求的设计流程图如下:

采用按目标的设计,相同会议ID,不管多少次请求,请求椅子的总数就是10把。多次请求不改变行为,从而实现了幂等。

总结

支持幂等是一个接口的基本素养

(0)

相关推荐

  • PHP设计模式之观察者模式

    PHP设计模式之观察者模式 观察者,貌似在很多科幻作品中都会有这个角色的出现.比如我很喜欢的一部美剧<危机边缘>,在这个剧集中,观察者不停的穿越时空记录着各种各样的人或事.但是,设计模式中 ...

  • Java校招笔试题-Java基础部分(三)

    导语   Java 面试题集2021版 Java基础部分三 26.说说has a 与is a的区别   is-a表示的是属于的关系,也就是说马是属于动物的一种表示的是一种继承的关系.   has-a ...

  • 基于有限状态机与消息队列的三方支付系统补单实践

    0.引言 在日常生活中,从线下的超市购物到线上的外卖点餐.电商网购等,支付无时无刻不在发生,不论是通过现金.pos 机刷卡还是微信支付宝等第三方支付.线上支付有着及时便捷一气呵成的极致体验,当然也有少 ...

  • 接口幂等性如何实现?

    导读 现在这个时代大家可能最关心的就是钱了,那么有没有想过你银行转账给你没有一次是转多的,要么失败,要么成功,为什么不能失误一下多转一笔呢?醒醒吧年轻人,别做梦了,做银行的能那么傻x吗? 今天我们就来 ...

  • 实现接口幂等性的几种方案

    抢微信红包的时候我们都知道:一个红包一旦你抢过之后,以后无论你点多少次都是一样的结果.红包会提示你已经抢过此红包,而不会让你再抢一次. 抢红包接口就是一个非常典型的幂等接口,抢一次和抢多次具有一样的效 ...

  • 什么是接口的幂等性,如何实现接口幂等性?

    什么是接口的幂等性,如何实现接口幂等性? (一)幂等性概念 幂等性原本是数学上的概念,用在接口上就可以理解为:同一个接口,多次发出同一个请求,必须保证操作只执行一次. 调用接口发生异常并且重复尝试时, ...

  • 稳定性三十六计-超时处理

    引子 分布式系统调用的三态 在传统的单机系统中,调用一个函数,要么返回成功,要么返回失败.这就是两态系统(2-state system). 在分布式系统中,由于系统是分布在不同机器上的.还可能有一种状 ...

  • 稳定性三十六计-历史记录

    引子 半夜三点,睡梦中被一阵没人接听誓不罢休的电话铃吵醒.睡眼惺忪的接听了电话,电话那头传来了不用听清任何人类语言就能感受的焦急.让我赶快打开电脑,说服务整个不工作了! 打开监控看到线程池被打满.本着 ...

  • 稳定性「三十六计」实战和背后的逻辑

    背景 不同于<编写代码的「八荣八耻」>,<稳定性「三十六计」>是应用于设计阶段的非手脚架方式的标准化. 在实际工作中,通常会提倡给新人机会,让他们自己去设计系统.这时候如果没有 ...

  • 幂的乘方 教学设计

    我讲课的题目华东师大出版社义务教育课程标准实验教科书数学八年级上册第14章"整式的乘法"的第一节的第二课时:幂的乘方 一.教材分析: 本章是整式运算的重要内容,是进一步学习因式分解 ...

  • 学术简报|低速运行时异步驱动转速自适应观测器稳定性分析与设计

    摘要 合肥工业大学电气与自动化工程学院的研究人员李筱筠.杨淑英等,在2018年第23期<电工技术学报>上撰文指出,尽管全阶观测器广泛应用于异步电驱动系统进行速度观测,但其稳定性问题,尤其是 ...

  • 【学术论文】一种高稳定性的无片外电容的LDO的设计

       摘 要 : 考虑到LDO应用在无分立器件的情况下,针对在无片外电容和无片外电阻的情况下对LDO进行研究设计,在无外接电容的情况下,LDO同样能够输出稳定电压,以应用在DC-DC转换器中为内部电路 ...

  • C#设计一个简单的计算器,实现两个数的加,减,乘,除,求幂等计算,运行效果如下图所示:

    C#设计一个简单的计算器,实现两个数的加,减,乘,除,求幂等计算,运行效果如下图所示:

  • ​浅析农贸市场设计改造与动态线路规划的重要性

    浅析农贸市场设计改造与动态线路规划的重要性 现代农贸市场的日常运作,动态线路设计必须保持稳定发展的首要因素.完善合理的动态线路规划,不仅能反映进入市场时的客货供应情况,而且对引导顾客的购物趋势也有很大 ...

  • 农贸市场设计中形式匹配的基本条件是什么?

    农贸市场设计中形式匹配的基本条件是什么?   现代农贸市场设计中的业态匹配原则是什么?在进行业态匹配时,现代农贸市场应满足哪些基本条件?   业态匹配是现代农贸市场运作的一个非常重要的因素.杭州佰映介 ...