前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编程思想之幂等性 | 编程之道

编程思想之幂等性 | 编程之道

作者头像
AlicFeng
发布2018-10-08 14:35:41
7490
发布2018-10-08 14:35:41
举报

前言

今年年初遇到项目灾难,解决了不少问题,这是其中一个问题。很早的时候写的,学以致用的。今天看到还有这样一篇稿文,那就整理下分享给大家学习!编程思想之幂等性


什么是幂等性 既然幂等性源于数学,那我就使用数学公式来表示,即可一目了然!

代码语言:javascript
复制
f(f(x)) = f(x)

显然,从上面的二元函数可以看出,无论x(等幂元素)被函数y无限地执行运算,它的结果都是相同的。在计算机编程领域中,我们可以这么定义幂等性:在调用某个方法、接口中,我们使用相同的参数(相同的特定参数),其返回值都是相同的,我们便可称方法、接口具有幂等性。从信仰上说,幂等性是一种承诺,只要一次答应某个承诺,其承诺内容都是不会改变的。

Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.

如何理解幂等性 理解性的理论,举例子掌握最快。

  • 无心举例,看场景更易理解。哈哈

幂等性场景设计

下单处理

这个例子曾经出现在我的身边:微信服务端在搞事情! 客户端提交数据超过十秒后,他会定时在十秒后自行断开并自动再次发起请求,请求的数据体一模一样,但是这样的请求是不合法的,属重复请求。如何解决此事呢?可以使用幂等性作为一个良好的解决方案。为解决此问题,在此先谢谢腾讯大佬CC,后会无期!

原本的方法是这样设计的

代码语言:javascript
复制
function add($userToken, $orderMessage){
  //todo
}

这样处理那就不能规避重复请求了。

基于幂等性来解决此问题,改进的设计方法

代码语言:javascript
复制
function add($seq,$userToken, $orderMessage){
  // 现根据seq来判断是否已经处理过了,是的话就返回第一次处理的结果
  $resultJson = $this->redis->get('***_pre_' . $seq);
  if(false != $resultJson){
    return $resultJson;
  }
  // 既然没有处理过,那就正式处理
  // todo 
  // 处理完了,没有问题那就将结果保存起来
  // todo
  return $resultJson;
}

幂等性属于解决此问题的一部分,是解决方案的一部分,还有另一部分是异步


提现 基于幂等性设计 | 防止用户多次点击(后端是不相信前端处理的)或者突然网络异常等情况下,可以保持数据的一致性。

两个步骤:

  • 后端生产票据 | 生产队时给你发粮票,你才有机会拿钱去购买柴米油盐酱醋茶
  • 根据上一步拿到合法的票据来提现
代码语言:javascript
复制
function createTicketSequence($user) : string{
  // todo 
}
代码语言:javascript
复制
function withdraw($ticketSequence,$user,$amount){
  // todo
}

场景理解 1、用户在取款的时候,客户端先带上token请求服务端生成一个合法的取款凭证ticketSequeuence 2、用户在输入取款金额并确认取款后,客户端将会带上用户登录凭证userToken、取款票据ticketSequence以及取款金额amount进行请求 3、服务端接收到请求后,先校验userToken,校验失败则返回重新登录,否则换取user对象 4、用户鉴权通过后,那么再来校验取款票据ticketSequence,票据不合法,那么取款失败,否则继续进行取款,一直到取款成功并根据票据作为幂等值来保存提现成功的结果 5、即使客户端请求后与服务端失去了联系,并且服务端处理成功,客户端处于假死的状态并再次请求取款,也是返回第一次的结果,并且是迅速的响应。

价值源于技术,技术源于分享!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.09.16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档