当前位置:首页 > 网络作品 > 正文内容

什么是幂等?如何实现

canca4年前 (2022-01-17)网络作品561

1. 什么是幂等

在微服务架构下,我们在完成一个订单流程时经常遇到下面的场景:

一个订单创建接口,第一次调用超时了,然后调用方重试了一次

在订单创建时,我们需要去扣减库存,这时接口发生了超时,调用方重试了一次

当这笔订单开始支付,在支付请求发出之后,在服务端发生了扣钱操作,接口响应超时了,调用方重试了一次

一个订单状态更新接口,调用方连续发送了两个消息,一个是已创建,一个是已付款。但是你先接收到已付款,然后又接收到了已创建

在支付完成订单之后,需要发送一条短信,当一台机器接收到短信发送的消息之后,处理较慢。消息中间件又把消息投递给另外一台机器处理

以上问题,就是在单体架构转成微服务架构之后带来的问题。当然不是说单体架构下没有这些问题,在单体架构下同样要避免重复请求。但是出现的问题要比这少得多。

为了解决以上问题,就需要保证接口的幂等性,接口的幂等性实际上就是接口可重复调用,在调用方多次调用的情况下,接口最终得到的结果是一致的。有些接口可以天然的实现幂等性,比如查询接口,对于查询来说,你查询一次和两次,对于系统来说,没有任何影响,查出的结果也是一样。

除了查询功能具有天然的幂等性之外,增加、更新、删除都要保证幂等性。那么如何来保证幂等性呢?

2. 保证幂等性的方案

2.1全局唯一ID

如果使用全局唯一ID,就是根据业务的操作和内容生成一个全局ID,在执行操作前先根据这个全局唯一ID是否存在,来判断这个操作是否已经执行。如果不存在则把全局ID存储到存储系统中,比如数据库、redis等。如果存在则表示该方法已经执行。

从工程的角度来说,使用全局ID做幂等可以作为一个业务的基础的微服务存在,在很多的微服务中都会用到这样的服务,在每个微服务中都完成这样的功能,会存在工作量重复。另外打造一个高可靠的幂等服务还需要考虑很多问题,比如一台机器虽然把全局ID先写入了存储,但是在写入之后挂了,这就需要引入全局ID的超时机制。

使用全局唯一ID是一个通用方案,可以支持插入、更新、删除业务操作。但是这个方案看起来很美但是实现起来比较麻烦,下面的方案适用于特定的场景,但是实现起来比较简单。

2.2去重表

这种方法适用于在业务中有唯一标的插入场景中,比如在以上的支付场景中,如果一个订单只会支付一次,所以订单ID可以作为唯一标识。这时,我们就可以建一张去重表,并且把唯一标识作为唯一索引,在我们实现时,把创建支付单据写入去重表,放在一个事务中,如果重复创建,数据库会抛出唯一约束异常,操作就会回滚。

2.3 插入或更新

这种方法插入并且有唯一索引的情况,比如我们要关联商品品类,其中商品的ID和品类的ID可以构成唯一索引,并且在数据表中也增加了唯一索引。这时就可以使用InsertOrUpdate操作。

2.4 多版本控制

这种方法适合在更新的场景中,比如我们要更新商品的名字,这时我们就可以在更新的接口中增加一个版本号,来做幂等

boolean updateGoodsName(int id,String newName,int version);
update goods  set  name=?, version=?  where id=?  and  version<?

2.5 状态机控制

这种方法适合在有状态机流转的情况下,比如订单的创建和付款,订单的付款肯定是在创建之前,这时我们可以通过在设计状态字段时,使用int类型,并且通过值类型的大小来做幂等,比如订单的创建为0,付款成功为100。付款失败为99

在做状态机更新时,我们就这可以这样控制

update  `order`  set  status=?  where  id=?  and  status<?

以上就是保证接口幂等性的一些方法。


扫描二维码推送至手机访问。

版权声明:本文由Ant.Master's Blog发布,如需转载请注明出处。

本文链接:https://iant.work/post/797.html

标签: 幂等
分享给朋友:

“什么是幂等?如何实现” 的相关文章

浮躁的人

在网上看到,觉得挺有道理,收藏了~~   1.不要看到别人的回复第一句话就说:给个代码吧!你应该想想为什么。当你自己想出来再参考别人的提示,你就知道自己和别人思路的差异。     2.初学者请不要看太多太多的书那会误人子弟的,先找本系统的学,很多人用了很久都是只对部分功能熟悉而已,不系统还...

学编程的人不能不看的好文章

    做为一名大四的学生,我面试过不少的单位,有成功的也有失败的,但是对我来说所有的失败在某种意义上都是一种成功,特别是我下面写的这些,写这篇文章的时候,我已经签了南京的一家软件公司,但是想起今年2月21日我面试苏州台湾的IT公司的经历联想到我们现在学习编程的一些情况...

乌鸦歌

    乌鸦不是我们中国人喜欢的鸟。要是有一只乌鸦在头顶呱呱乱叫,喜气洋洋的人会败了兴致,一肚子心事的人会愁上加愁。幸亏北京的乌鸦不多。`    到巴基斯坦住下来,我不由吓了一跳,这里的乌鸦不胜其多,它们黑得不像天下别的乌鸦那么彻底,脖子处...

老乌鸦(童谣)

老乌鸦,年纪老,飞不动,跳不高,躲在窝里呀呀叫,小乌鸦,身体好,捉到虫,找到肉,送给妈妈吃个饱。 ----乌鸦其实也挺美...

乌鸦歌

  南高峰有一只乌鸦,生得一身漆黑,天天飞到西湖上去照照自己的影子。觉得非常好看,便赞美自己说:    “头戴乌纱帽,     身穿黑衣裳。     镜里照一照,     好个少年郎!     谁家有小姐?     待我讨来做新娘。”   一天百鸟仙子请乌鸦吃酒,有白鹅,白鸡,白鸭,白鸽做...

我们与蚂蚁

        突然想到要写这么篇东西,没有任何理由,也没有任何意义想要传递,就是因为这几天阅读梅特林克的随笔,发现里面有很多关于动植物的内容。其中有关蚂蚁的那组,格外引起我的兴趣。打小我就喜欢观察蚂蚁,后来又读过一些关于蚂蚁的文...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。