RESTful API 工具箱之幂等性(TODO)

2 篇文章 0 订阅
2 篇文章 0 订阅

有一个比较不错的解释,点我
幂等性是某种操作固有的性质, 还是我们可以把所有类型的操作都可以实现为幂等的。有些操作天生就是幂等的, 譬如说, 取数据操作,复制操作,我执行无数次取数据操作或者复制操作, 结果和执行一次是一样的。 有些操作就不是幂等的,像删除操作,转账操作。 删除第二次的时候,系统可能说这个资源已经不存在;转账操作执行第二次的时候,你就多转了一倍的钱。客观上,这种操作本质上就不可能是幂等的。如果要模拟幂等:就是说客户可以尝试多次去执行这个操作,就要先拿到唯一标示这次操作的id, 然后,拿着这个id去重试,服务器就认得这次操作,如果这次操作,以执行完毕,返回OK给客户端,如果还没执行,就真正去执行这个请求,再返回OK给客户。这个操作本质上只是被执行了一遍,但是这样的设计可以让客户端重试多次,貌似成了一个幂等的操作。

关于如何实现一个幂等的取钱操作,基本思想就是,我先要取得一个transaction id, 用这个id去记录这个取钱的操作是否已经执行过。客户端每次尝试取钱都要带着这个id, 服务器端就会知道这个transaction有没有已经执行完毕。
我的疑问是

  1. 服务器什么时候可以把这些transaction id的数据清除掉?还是一直要存着?在我看来,一直存着这些数据,并没有意义。一个可能的方案就是当客户端知道自己的取钱操作已经成功执行的时候,可以额外发一个请求去删掉对应的transaction id。而删除操作是幂等的,客户端可以使劲re-try直到删除。
  2. 分布式事务是怎么做到的?TODO:
  3. 还有其他方法实现幂等的取钱操作吗?TODO: 异步的方式?先去提交取钱这个Job, 然后可以尝试去Get这个Job, 但是这个Job也要一个token去标记,有点类似。
  4. 幂等的好处是什么? 幂等的取钱操作首要解决的问题就是在不使用分布式事务的情况下,避免了取钱操作错误地重复执行。但是该问题 的大背景是,网络不稳定。假如说网络是一种理想情况下完全稳定的,那么,就不需要分布式事务或者幂等,因为我每次请求都可以正确执行并拿到结果。TODO

不错的资料:
https://mathieu.fenniak.net/idempotent-web-apis-what-benefit-do-i-get/
http://www.quora.com/What-are-the-benefits-of-an-idempotent-API
https://www.safaribooksonline.com/library/view/restful-web-services/9780596809140/ch01s04.html
http://www.infoq.com/news/2013/04/idempotent

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值