前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >腾讯云 API 最佳实践: 善用幂等性

腾讯云 API 最佳实践: 善用幂等性

原创
作者头像
zqfan
修改于 2021-08-11 14:49:29
修改于 2021-08-11 14:49:29
6.9K4
举报
文章被收录于专栏:腾讯云API腾讯云API

有些开发者问我云服务器创建实例”接口有一个参数“ClientToken”不知道有什么作用。本文作一个简单的解答。

  1. ClientToken 是防止重复创建资源的;
  2. 对于创建资源的接口,你总是应该用到 ClientToken;
  3. 不同的请求用不同的 ClientToken,同一个请求用相同的 ClientToken;
  4. 欢迎对不支持 ClientToken 的发货类接口提出支持的诉求。

注意这里的同一个请求不是说你参数相同就是同一个请求,而是指你的目的性。举例来说,zqfan这个用户现在创建了一台服务器,过会儿又想创建同样的一台服务器,这叫两个不同的请求。虽然参数一样,但目的就是创建规格一样的两台机器,分两次请求发送,这两个请求的 ClientToken 应该指定不同的值。

ClientToken是什么?

如文档所言:

“用于保证请求幂等性的字符串。该字符串由客户生成,需保证不同请求之间唯一,最大值不超过64个ASCII字符。若不指定该参数,则无法保证请求的幂等性。”

ClientToken是需要调用者指定的,通常你直接给一个 UUID就够了 ,例如 a9a90aa6-751a-41b6-aad6-fae360632808 。更好一点的,你可以指定一个前缀以示用途,例如CT-a9a90aa6-751a-41b6-aad6-fae360632808 。

什么是幂等性?

wikipedia上的解释说:

“Idempotence is the property of certain operations in mathematics and computer science that they can be applied multiple times without changing the result beyond the initial application.”

简单地说就是无论操作多少次,结果都应该是一样的。用数学语言来表述: x * x = x

为什么要幂等性?

在查询类的接口里,你基本上是不会想要上一次的结果,而只关心当前的结果,在你不做改变系统状态的操作时,你反复调用查询接口,其返回应该是一样的。同样的,修改操作你也不会关心上一次结果,当你重复调用修改操作时,只要这一次成功了,目的就算达到了,如果失败了,再重试(如果可重试的话)直到成功即可。删除操作同理。

但是对于一些资源创建类的,单纯的重试就有问题了。云服务器的“创建实例”接口可以一次创建一百台实例,包年包月预付费。如果这一次你调用接口失败了,例如在返回结果前网络中断了,死机了,你设置的超时时间太短提前关闭了连接等等,服务器当前的状态你是不知道的。你只能去查询实例列表,还得按时间排序,确定下到底是否创建成功了,哪一批是上一次请求创建的,最终的结果难以保证正确性。如果是在代码里呢,你该怎么办?到底是重试,还是放弃直接抛出异常?重试,你会立刻创建新的一百台实例。抛出异常,可能服务器明明成功了,只是因为你所在环境网络不稳定,你的程序就运行不下去了,你的代码健壮性就太差了。

为了防止创建资源时发生重复下单的问题,引入幂等性的概念。服务器根据唯一标识符, 在腾讯云 API 中是 ClientToken ,判断操作是否曾经发生过。如果找到了同样的标识符,则表示这个操作发生过,直接返回上一次的结果;如果没有发生过,继续执行。

例如,现在你调用“创建实例”接口,同时指定了 ClientToken=CT-a9a90aa6-751a-41b6-aad6-fae360632808 。假设接口发生异常,你立刻再次发送同样的请求,带上同样的 ClientToken ,服务器会返回上一次的结果,而不是再去创建一批新的实例。

幂等性的局限性?

严格的幂等是理想的结果,实际上,现实的系统是难以达到的。古希腊哲学家赫拉克利特说过:"人不能两次踏进同一条河流"。

例如云服务器有一个接口“查看实例列表”,它是个只读的接口,返回的实例里有个实例状态的属性,按理它应该是要幂等的,但是当你对其中某个云服务器关机后,又或者单纯的是服务器正在例行维护自动关机了,那下次再去调用返回的结果,显然和上一次会不一样的。何况每一个请求都有 RequestId 标识符,这个标识符每次都不一样以区别不同的请求。

再比如云服务器的另一个接口“退还实例”,如果退还成功,它会正常返回。当你再次退还,会返回资源未找到的错误信息。这种情况下,虽然返回的不同,但是你的目的达到了。正常删除资源和试图删除不存在的资源,它们表义不同,但实际结果是等价的,都达到了令目标资源不再存在的目的。

又如前文所述,幂等性需要记录每一个带有幂等操作标识符的请求的结果。服务器无意承担一些不必要的存储负担,因此不涉及到资源变动的只读接口,或者涉及到资源变动,但是本身就自带幂等属性的修改、删除接口都是不会有幂等操作标识符的。

我们还需要考虑高并发的场景。假设两个请求同时发起,都有同样的 ClientToken ,那么总有一个返回先后,后返回的理论上是要和先返回的一致的。但是在分布式高并发系统里,先发出的请求未必先到达服务器,先到达服务器的未必先入库。如果先入库的请求还未处理完毕,另一个请求无法入库(唯一性)又查询不到结果,只能返回一个内部异常(理想情况下应该返回操作正在执行中)。在调用者看来,可能会发生第一个返回是内部异常,第二个返回是正常的预期结果的情况。严格来说,这并不是幂等的,但是只要调用者合理安排,这种情况是可以避免的,例如失败请求后你可以休眠几十毫秒到几秒再去请求。只要某一次请求有确定的结果,后续重复的请求都将返回这个结果。

调用者使用幂等性时,需要注意,不同的请求,它的 ClientToken 必须是不一样的,同一个请求,它的 ClientToken 必须是一样的。也就是说,服务器端完全依靠 ClientToken 来判断是否是同一个请求,而不管其他具体的参数。这就要求调用者得自己确保 ClientToken 不冲突,否则你以为接口返回成功了,其实是之前某一个请求的结果 。此外,为了将来能重复查询,你还必须将其缓存或者持久化。

腾讯云对幂等性支持的情况?

原则上,我们要求所有的资源创建类接口都要支持幂等性。但是每个产品的情况是各有差异的,我们暂时无法一刀切,只能根据实际情况进行判断。有些产品可能刚开始觉得没必要支持幂等性,但是后来随着用户的诉求,或者产品自身的发展,才决定要支持幂等性。这是一个发展的过程,还请用户谅解,并对我们产品的 API 监督和督促,提出意见和建议,共同成长,创造价值。

以下是目前(2021-08-11)我掌握的,支持幂等性的 API 3.0 接口:

总结

看完了这篇短文,你明白了 ClientToken 的作用了吗?这里再回顾一下你在使用腾讯云 API 时应当采取的策略:

  1. ClientToken 是防止重复创建资源的;
  2. 对于创建资源的接口,你总是应该用到 ClientToken;
  3. 不同的请求用不同的 ClientToken,同一个请求用相同的 ClientToken;
  4. 欢迎对不支持 ClientToken 的创建类接口提出诉求。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
4 条评论
热度
最新
记住这四个策略了
记住这四个策略了
回复回复点赞举报
感谢分享
感谢分享
回复回复点赞举报
学习了~
学习了~
回复回复点赞举报
看过之后了解了 ClientToken 的作用,收获很大
看过之后了解了 ClientToken 的作用,收获很大
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
什么是接口幂等性?为什么会产生接口幂等性问题?如何保证接口幂等性?
博主负责的项目报了一个问题,用户操作回退失效。我们的设计里,操作回退是回到操作前的状态。经过查看日志发现,用户之前的操作做了两次,也就是说提交操作的接口被调用了两次,导致之用户上一次的状态和这一次的状态是一样的,所以操作回退是没有问题的,问题出在了操作的接口被调用了两次。
三分恶
2020/12/01
1.6K0
什么是接口幂等性?为什么会产生接口幂等性问题?如何保证接口幂等性?
深入理解幂等性!!!
导读 文章转载自幂等性如何实现?带你了解一波!!! 现在这个时代大家可能最关心的就是钱了,那么有没有想过你银行转账给你没有一次是转多的,要么失败,要么成功,为什么不能失误一下多转一笔呢?醒醒吧年轻人,别做梦了,做银行的能那么傻x吗? 今天我们就来谈一谈为什么银行转账不能多给我转一笔?关乎到钱的问题,小伙伴们打起精神!!! 要想要理解上述的疑惑,不得不提的一个概念就是幂等性,至于什么是幂等性,如何通过代码实现幂等性,下面将会详细讲述。 什么是幂等性 所谓幂等性通俗的将就是一次请求和多次请求同一个资源产生相同
码猿技术专栏
2020/03/26
5.1K0
深入理解幂等性!!!
面试必问,如何保证接口的幂等性?
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/07/20
6090
面试必问,如何保证接口的幂等性?
如何保证接口幂等性?高并发下的接口幂等性如何实现?
接口幂等性这一概念源于数学,原意是指一个操作如果连续执行多次所产生的结果与仅执行一次的效果相同,那么我们就称这个操作是幂等的。在互联网领域,特别是在Web服务、API设计和分布式系统中,接口幂等性具有非常重要的意义。
用户11397231
2025/01/24
1170
如何保证接口幂等性?高并发下的接口幂等性如何实现?
如何理解 RESTful 的幂等性
HTTP幂等方法,是指无论调用多少次都不会有不同结果的 HTTP 方法。不管你调用一次,还是调用一百次,一千次,结果都是相同的。
芋道源码
2019/10/29
1.1K0
系统设计——幂等性与解决方案
摘要 幂等概念来自数学,表示N次变换和1次变换的结果是相同的。这里讨论在某些场景下,客户端在调用服务没有达到预期结果时,会进行多次调用,为避免多次重复的调用对服务资源产生副作用,服务提供者会承诺满足幂等。HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的副作用(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。
终有救赎
2023/10/16
4990
系统设计——幂等性与解决方案
面试必问,如何保证接口的幂等性?
我们都知道面试的时候,什么问题,都会有,这个全看面试官想问什么,但是有一些比较专业的术语,可能对于小白来说,就不是很好,一个学妹,面试的时候,就被问到了一个问题,接口的幂等性,你们是怎么保证的?这个问题,学妹可能不知道幂等性是个什么概念,所以,也就没有办法精准的定位,把面试官想要的答案说出来,今天就来说说如何保证接口的幂等性。
公众号 IT老哥
2022/09/19
4580
面试必问,如何保证接口的幂等性?
REST API有关幂等性等11条最佳实践
在我的职业生涯中,我使用了数百个 REST API 并制作了数十个。由于我经常在 API 设计中看到相同的错误,因此我认为写下一组最佳实践可能会更好。
lyb-geek
2023/11/08
3850
REST API有关幂等性等11条最佳实践
接口的幂等性
接口的幂等性是指无论调用多少次,接口的执行结果都是一致的。简而言之,对于同一个请求,无论执行一次还是多次,都不会产生不同的结果。这对于系统的可靠性和稳定性至关重要。
GeekLiHua
2025/01/21
640
接口的幂等性原则
 现如今我们的系统大多拆分为分布式SOA,或者微服务,一套系统中包含了多个子系统服务,而一个子系统服务往往会去调用另一个服务,而服务调用服务无非就是使用RPC通信或者restful,既然是通信,那么就有可能在服务器处理完毕后返回结果的时候挂掉,这个时候用户端发现很久没有反应,那么就会多次点击按钮,这样请求有多次,那么处理数据的结果是否要统一呢?那是肯定的!尤其在支付场景。
Lansonli
2021/10/09
5390
如何保证系统幂等性?多场景、多方位剖析
客户点击提交订单按钮,但由于网络延迟,客户未看到反馈而再次点击提交。服务器需要处理这种可能的重复提交,确保订单只被创建一次。
JanYork_简昀
2024/04/20
4530
02 RESTFul接口和HTTP的幂等性分析
用户7630333
2023/12/07
2330
分布式系统中所说的幂等性
大型网站应用架构中,越来越多的SOA或Restful的web api的流行归功于http协议。 幂等性定义 Http协议涉及到一种重要性质:幂等性。 Http方法的幂等性指一次和多次请求某一个资源应该具有相同的副作用。 分布式事务 vs 幂等设计 先从一个例子说起,假设有一个从账户取钱的远程API(可以是HTTP的,也可以不是),我们暂时用类函数的方式记为: bool withdraw(account_id, amount) withdraw的语义是从account_id对应的账户中扣除amount数额的钱
春哥大魔王
2018/04/17
7420
理解幂等性
为了解决以上问题,就需要保证接口的幂等性,接口的幂等性实际上就是接口可重复调用,在调用方多次调用的情况下,接口最终得到的结果是一致的。有些接口可以天然的实现幂等性,比如查询接口,对于查询来说,你查询一次和两次,对于系统来说,没有任何影响,查出的结果也是一样。
somenzz
2020/11/25
5860
幂等性
老婆问了个问题,什么是“幂等性”?这个问题,从现象上好解释,例如今儿是618大促,购物车添加了丰富的商品,满心欢喜地点击了支付按钮,支付成 功了,但是返回的时候网络异常,不知道是不是扣款成功了,实际上在服务端货款已经扣了,此时再点击支付按钮,如果第二次扣款成功,则就是多扣钱了,如果第 二次扣款不成功,符合我们的预期,说明这个支付的功能,满足“幂等性”。
bisal
2019/06/19
1.2K0
如何保证接口幂等性?
幂等性原本是数学上的概念,用在接口上就可以理解为:同一个接口,多次发出同一个请求,必须保证操作只执行一次。调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。
程序猿川子
2023/01/05
7880
接口的幂等性
实际开发中在接口设计的时候对于接口的幂等性问题一定要进行考虑的,现对这部分内容做一个梳理
在水一方
2022/06/14
4140
幂等性如何保证
幂等概念来自数学,表示对数据源做N次变换和1次变换的结果是相同的。在工程中幂等性用来表示用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
main方法
2021/06/17
1.1K0
幂等性如何保证
详细讲解服务幂等性设计
在日常工作中的一些技术设计方案评审会上,经常会有提到注意服务接口的幂等性问题,最近就有个同学就跑到跟前问我,幂等性到底是个啥?
架构精进之路
2021/11/08
1.8K0
详细讲解服务幂等性设计
如何保证分布式情况下的幂等性
关于这个分布式服务的幂等性,这是在使用分布式服务的时候会经常遇到的问题,比如,重复提交的问题。而幂等性,就是为了解决问题存在的一个概念了。
Java极客技术
2023/10/26
3680
如何保证分布式情况下的幂等性
相关推荐
什么是接口幂等性?为什么会产生接口幂等性问题?如何保证接口幂等性?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档