如何理解接口的幂等性的多重考虑

发布时间:2021-10-23 17:50:17 作者:iii
来源:亿速云 阅读:119

本篇内容主要讲解“如何理解接口的幂等性的多重考虑”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解接口的幂等性的多重考虑”吧!

正文

1 接口幂等性

     就是说在多次相同的操作下保证最终的结果是一致的。

    其实这个概念还是比较简单的,很容易理解,那我们思考一个问题,如果不保证接口幂等性会有什么问题

1.1 案例

    我们简单的举个例子,现在有一个接口,提供了转账的功能,a要给b转账1000元,正常情况下我们接口一次性就调用成功了,但是却因为网络抖动等其它原因没有成功,于是就开始不停的重试,突然网络好了,但是这时却连续发出去了三个请求,但是这个接口没有保证幂等性,于是从结果上来看就是a给b转了3000元,这显然是程序业务逻辑上不能接受的(其实moon可以当b的)。

2 解决方案

2.1 token机制

    token机制其实是比较简单的,我们先来简单的说一下流程。</br>

    图示如下:

如何理解接口的幂等性的多重考虑

    token机制实现方式还是比较简单的,但是其实对于我们某些响应速度要求很高的业务不太友好,缺点就是需要多一次请求获取token的过程

    正常来说是每次请都会生成一个新的token,如果有极限情况下,有两个请求都带着相同的token进来,会存在都走入判断是否存在的过程,可能都会同时查到存在,这样也会有问题,针对这种情况,我们可以在删除前判断下是否存在,存在就删除,为了保证原子性,这部分逻辑建议使用lua脚本完成

2.2 去重表

    去重表的机制是根据mysql唯一索引的特性来的,我们先来说下它的流程:

    图示如下:

如何理解接口的幂等性的多重考虑

    去重表机制的问题有两点:

2.3 redis 的 SETNX键值

    过程如下:

    这里我们是利用了redis setnx 的特性来完成的。</br>

    setnx:只在键key不存在的情况下,将键key的值设置为value。若键key已经存在,则SETNX命令不做任何动作。命令在设置成功时返回1,设置失败时返回0

    图示如下:

如何理解接口的幂等性的多重考虑

    这种方案可以说是针对上一个方案改进的,效率也会提高很多。

2.4 状态机幂

    这种机制适用于有不同状态的业务,moon的上一家公司就是这样做的。

    我们的订单系统,一条订单会有多个状态,如:待付款,锁定,已付款等状态,而这些状态都是有流程和逻辑的,我们可以根据这个状态判断是否执行后续业务操作。

2.5 乐观锁(更新操作)

    就是数据库中增加版本号字段,每次更新根据版本号来判断

    过程如下:

    这个图示我就不再画了,还是比较简单的

2.6 悲观锁(更新操作)

    假设每一次拿数据,都有认为会被修改,所以给数据库的行上锁,也是基于数据库特性来完成。

     当数据库执行select for update时会获取被select中的数据行的行锁,因此其他并发执行的select for update如果试图选中同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果。

START TRANSACTION; # 开启事务
SELETE * FROM TABLE WHERE .. FOR UPDATE;
UPDATE TABLE SET ... WHERE ..;
COMMIT; # 提交事务

到此,相信大家对“如何理解接口的幂等性的多重考虑”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. 一文讲解高并发下的接口幂等性怎么实现?
  2. 幂等性学习及接口的幂等性

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

redis

上一篇:linux中tmux怎么用

下一篇:linux中moro工具怎么用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》