幂等 订阅
幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的.更复杂的操作幂等保证是利用唯一交易号(流水号)实现。 展开全文
幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的.更复杂的操作幂等保证是利用唯一交易号(流水号)实现。
信息
外文名
idempotent
常见于
抽象代数
中文名
幂等
属    性
一个数学与计算机学概念
幂等定义
在数学里,幂等有两种主要的定义。在某二元运算下,幂等元素是指被自己重复运算(或对于函数是为复合)的结果等于它自己的元素。例如,乘法下仅有两个幂等实数,为0和1。某一元运算为幂等的时,其作用在任一元素两次后会和其作用一次的结果相同。例如,高斯符号便是幂等的。一元运算的定义是二元运算定义的特例设S为一具有作用于其自身的二元运算的集合,则S的元素s称为幂等的(相对于*)当s *s = s.特别的是,任一单位元都是幂等的。若S的所有元素都是幂等的话,则其二元运算*被称做是幂等的。例如,联集和交集的运算便都是幂等的。设f为一由X映射至X的一元运算,则f为幂等的,当对于所有在X内的x,f(f(x)) = f(x).特别的是,恒等函数一定是幂等的,且任一常数函数也都是幂等的。注意当考虑一由X至X的所有函数所组成的集合S时。在f在一元运算下为幂等的若且唯若在二元运算下,f相对于其复合运算(标记为o)会是幂等的。这可以写成f o f = f。
收起全文
精华内容
下载资源
问答
  • 幂等

    2019-09-26 04:48:07
    get方式请求 : 幂等意味着对同一URL的多个请求应该返回同样的结果。 幂等的概念:  幂等(idempotent(幂等的)、idempotence(幂等性))是一个数学或计算机概念,常见抽象代数中。 幂等有以下几种定义:  对于单...

    get方式请求 : 幂等意味着对同一URL的多个请求应该返回同样的结果。

    幂等的概念:

      幂等(idempotent(幂等的)、idempotence(幂等性))是一个数学或计算机概念,常见抽象代数中。

    幂等有以下几种定义:

      对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次运算所得的结果是一样的,那么我们就称该运算是幂等。比如绝对值运算就是一个例子,在实数集中,有abs(a) = abs(abs(a))。

      对于双目运算,则要求当参与运算的两个值是等值的情况下,如果满足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在实数集中幂等,即max(x,x)= x。

     

    转载于:https://www.cnblogs.com/wym591273/p/10814779.html

    展开全文
  • 幂等 (idempotence) 的概念

    万次阅读 2020-08-16 02:33:11
    幂等 (idempotence) 的概念 幂等的数学概念 幂等是源于一种数学概念。其主要有两个定义 如果在一元运算中,x 为某集合中的任意数,如果满足 f(x) = f(f(x)) ,那么该 f 运算具有幂等性,比如绝对值运算 abs(a) = abs...

    幂等 (idempotence) 的概念

    幂等的数学概念

    幂等是源于一种数学概念。其主要有两个定义

    如果在一元运算中,x 为某集合中的任意数,如果满足 f(x) = f(f(x)) ,那么该 f 运算具有幂等性,比如绝对值运算 abs(a) = abs(abs(a)) 就是幂等性函数。

    如果在二元运算中,x 为某集合中的任意数,如果满足 f(x,x) = x,前提是 f 运算的两个参数均为 x,那么我们称 f 运算也有幂等性,比如求大值函数 max(x,x) = x 就是幂等性函数。

    幂等性在开发中的概念

    在数学中幂等的概念或许比较抽象,但是在开发中幂等性是极为重要的。简单来说,对于同一个系统,在同样条件下,一次请求和重复多次请求对资源的影响是一致的,就称该操作为幂等的。比如说如果有一个接口是幂等的,当传入相同条件时,其效果必须是相同的。

    特别是对于现在分布式系统下的 RPC 或者 Restful 接口互相调用的情况下,很容易出现由于网络错误等等各种原因导致调用的时候出现异常而需要重试,这时候就必须保证接口的幂等性,否则重试的结果将与第一次调用的结果不同,如果有个接口的调用链 A->B->C->D->E,在 D->E 这一步发生异常重试后返回了错误的结果,A,B,C也会受到影响,这将会是灾难性的。

    在生活中常见的一些要求幂等性的例子:

    1. 博客系统同一个用户对同一个文章点赞,即使这人单身30年手速疯狂按点赞,那么实际上也只能给这个文章 +1 赞
    2. 在微信支付的时候,一笔订单应当只能扣一次钱,那么无论是网络问题或者bug等而重新付款,都只应该扣一次钱

    幂等性与并发安全

    在查阅网络资料的时候,我看到许多文章把幂等性和并发安全的问题有些混淆了。幂等性是系统接口对外的一种承诺,而不是实现,承诺多次相同的操作的结果都会是一样的。而并发安全问题是当多个线程同时对同一个资源操作时,由于操作顺序等原因导致结果不正确。

    这两个实际上是完全独立的两个问题,比如说同一笔订单即使你不停的提交支付,如果扣除了多次钱,就说明该操作不幂等。而有多笔订单同时进行支付,最后扣除金额不是这多笔金额的总和,那么说明该操作有并发安全问题。所以幂等性和并发安全是完全两个维度的问题,要分开讨论解决。

    我在一些讨论幂等性的文章中看到中给出的解决方案为‘悲观锁’和‘乐观锁’,这两个方案可以很好的解决并发问题,但是却不应该是幂等性问题的解决方案,特别是悲观锁是用于防止多个线程同时修改一个资源的。倒是乐观锁的版本号机制可以勉强以 token 或者状态标识 作为版本号来实现幂等性(下文解释token状态标识),勉强说的过去。

    所以说幂等性与并发安全是不同的,在本文就只讨论幂等性的问题,对于并发安全问题不做讨论

    Http 协议与幂等性

    如果把操作按照功能分类,那就是增删改查四种,在 http 协议中则表现为 Get、Post、Put、Delete 四种。

    查询操作 (Get)

    Get 方法用于获取资源,不应当对系统资源进行改变,所以是幂等的。注意这里的幂等提现在对系统资源的改变,而不是返回数据的结果,即使返回结果不相同但是该操作本身没有副作用,所以幂等。

    删除操作 (Delete)

    Delete 方法用于删除资源,虽然改变了系统资源,但是第一次和第N次删除操作对系统的作用是相同的,所以是幂等的。比如要删除一个 id 为 1234 的资源,可能第一次调用时会删除,而后面所有调用的时候由于系统中已经没有这个 id 的资源了,但是第一次操作和后面的操作对系统的作用是相同的,所以这也是幂等的,调用者可以多次调用这个接口不必担心错误。

    修改操作 (Put)

    修改操作有可能是幂等的也可能不幂等。如果修改的资源为固定的,比如说把账户中金额改为 1000 元,无论调用几次都是幂等的。假如资源不固定,比如账户中金额减少50元,调用一次和调用多次的结果肯定不一样,这时候就不幂等了。在修改操作中想要幂等在下文中讨论。

    2019-08-13 修改

    原文对Put协议定义有错误,Put操作必须为幂等的,即如果声明为Put协议时就相当于对外声明这个接口是幂等的。所以对于原文举例说账户中金额减少50元这种操作在Put协议中是不允许的,只能做类似于账户中金额改为 1000 元的操作

    参考:https://restfulapi.net/idempotent-rest-apis/

    新增操作 (Post)

    Post 新增操作天生就不是一个幂等操作,其在 http 协议的定义如下:

    The POST method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line.

    https://www.w3.org/Protocols/...

    在其定义中表明了 Post 请求用于创建新的资源,这意味着每次调用都会在系统中产生新的资源,所以该操作注定不是幂等操作。这时候想要幂等就必须在业务中实现,方案在下文会讨论。

    实现幂等性的方案

    在上面提到的幂等性还是比较理论,下面结合一些常见的实际业务场景来讨论幂等性设计方案。

    去重表

    利用数据库的特性来实现幂等。通常是在表上构建一个唯一索引,那么只要某一个数据构建完毕,后面再次操作也无法成功写入。

    常见的业务就是博客系统点赞功能,一个用户对一个博文点赞后,就把用户 id 与 博文 id 绑定,后续该用户点赞同一个博文就无法插入了。或是在金融系统中,给用户创建金融账户,一个用户肯定不能有多个账户,就在账户表中增加唯一索引来存储用户 id,这样即使重复操作用户也只能拥有一个账户。

    状态标识

    状态标识是很常见的幂等设计方式,主要思路就是通过状态标识的变更,保证业务中每个流程只会在对应的状态下执行,如果标识已经进入下一个状态,这时候来了上一个状态的操作就不允许变更状态,保证了业务的幂等性。

    状态标识经常用在业务流程较长,修改数据较多的场景里。最经典的例子就是订单系统,假如一个订单要经历 创建订单 -> 订单支付取消 -> 账户计算 -> 通知商户 这四个步骤。那么就有可能一笔订单支付完成后去账户里扣除对应的余额,消耗对应的优惠卷。但是由于网络等原因返回了错误信息,这时候就会重试再次去进行账户计算步骤造成数据错误。

    所以为了保证整个订单流程的幂等性,可以在订单信息中增加一个状态标识,一旦完成了一个步骤就修改对应的状态标识。比如订单支付成功后,就把订单标识为修改为支付成功,现在再次调用订单支付或者取消接口,会先判断订单状态标识,如果是已经支付过或者取消订单,就不会再次支付了。

    Token 机制

    Token 机制应该是适用范围最广泛的一种幂等设计方案了,具体实现方式也很多样化。但是核心思想就是每次操作都生成一个唯一 Token 凭证,服务器通过这个唯一凭证保证同样的操作不会被执行两次。这个 Token 除了字面形式上的唯一字符串,也可以是多个标志的组合(比如上面提到的状态标志),甚至可以是时间段标识等等。

    举个例子,在论坛中发布一个新帖子,这是一个典型的 Post 新增操作,要怎样防止用户多次点击提交导致产生多个同样的帖子呢。可以让用户提交的时候带一个唯一 Token,服务器只要判断该 Token 存在了就不允许提交,便能保证幂等性。

    上面这个例子比较容易理解,但是业务比较简单。由于 Token 机制适用较广,所以其设计中要注意的要求也会根据业务不同而不同。

    Token 在何时生成,怎么生成?这是该机制的核心,就拿上面论坛系统来说,如果你在用户提交帖子的时候才生成 Token,那用户每次点提交都会生成新的 Token 然后都能提交成功,就不是幂等的了。必须在用户提交内容之前,比如进入编辑页面的时候生成 Token,用户在提交的时候内容带着 Token 一起提交,对于同一个页面无论用户提交多少次,就至多能成功一次。所以 Token 生成的时机必须保证能够使该操作具多次执行都是相同的效果才行。使用 Token 机制就要求开发者对业务流程有较好的理解。

    结语

    幂等性是开发当中很常见也很重要的一个需求。尤其是金融、支付等行业对其要求更加严格,既要有好的性能也要有严格的幂等性。除了对其概念的掌握,理解自身业务需求更是实现幂等功能的要点,必须处理好每一个结点细节,一旦某个地方没有设计完善,最后的结果可能仍旧达不到要求。

    展开全文
  • 幂等幂等

    2019-05-23 21:26:01
    幂等:多次操作或请求的结果都是一样的,比如说查询某条数据,即使请求接口超时,再继续请求第二第三次,查询的结果都是一致的。 非幂等:每一次操作的结果都是不一样的,比如说插入某条数据,发送插入请求时,插入...

    幂等:多次操作或请求的结果都是一样的,比如说查询某条数据,即使请求接口超时,再继续请求第二第三次,查询的结果都是一致的。
    非幂等:每一次操作的结果都是不一样的,比如说插入某条数据,发送插入请求时,插入接口发生超时,此时调用者再进行第二次发送请求,结果还是超时,再发送第三次请求,结果数据已经多次插入进去了,但我们只需要插入一条,这就是非幂。

    展开全文
  • 幂等性实现方案01

    万次阅读 2020-08-15 19:22:13
    幂等性实现方案 一、什么是幂等性 所谓幂等性,简单地说,就是对接口的多次调用所产生的结果和调用一次是一致的。扩展一下,这里的接口,可以理解为对外发布的HTTP接口或者Thrift接口,也可以是接收消息的内部接口,...

    幂等性实现方案

    一、什么是幂等性

    所谓幂等性,简单地说,就是对接口的多次调用所产生的结果和调用一次是一致的。扩展一下,这里的接口,可以理解为对外发布的HTTP接口或者Thrift接口,也可以是接收消息的内部接口,甚至是一个内部方法或操作。

    二、应用场景

    支付业务

    如上图所示用户下单后点击支付按钮进行支付。支付系统根据单号创建支付记录,然后调用银行接口,当一行扣款成功后,支付表修改支付状态为已支付。
    但是,存在这样的情况,用户点击按钮无效,连续点击多次,是否会出现同一个订单支付多次?如何避免?这就是今天要讲的的幂等性。

    作为对比,先看没有实现幂等性,也就是用户连续点击按钮,多次调用银行接口的情况。代码如下:

    public void  payForOrder(String orderId){
    
            Order order = orderDao.findById(orderId);
    
            Payment payment = paymentDao.findPaymentByOrderId(orderId);
    
            payment.setOrderId(orderId);
    
            payment.setMoney(order.getMoney());
    
            payment.setPayStatus("0");//正在处理中
    
            paymentDao.update(payment);
    
            String flag = tranService.invoke(url,paymentId); //调用银行接口
    
            payment.setPayStatus(flag);
    
            paymentDao.update(payment);
    
    }
    

    有上面代码可知,当用户对一个单多次点击支付时,上面的代码一定会出现多次调用银行接口的情况。那么问题来了,如何保证幂等性?

    介绍一个使用乐观锁实现幂等性的方案。通过新增版本号字段来实现。先看代码:

    public payForOrder(String orderId){
    
            Order order = orderDao.findById(orderId);
    
            Payment payment = paymentDao.findPaymentByOrderId(orderId);
    
            boolean invokeInterface = false ;
    
            payment.setOrderId(orderId);
    
            payment.setMoney(order.getMoney());
    
            payment.setPayStatus("0");//正在处理中
    
            payment.setVersion(0);
    
            int records = paymentDao.updateByVersion(payment);
    
            if(records ){
    
                    String flag = tranService.invoke(url,payment.getId()); //调用银行接口
    
                    payment.setPayStatus(flag);   
    
                    paymentDao.update(payment);
    
            }else{
    
                    logger.error("重复调用............+orderId="+orderId);
    
            }
    
    }
    

    updateByVersion的模拟代码为:

     update  t_payment  set  orderId = #{orderId} , money=#{money},  payStatus=#{payStatus}  version=#{ version } +1 
    
        where id=#{id} and version=#{version}
    

    用户第一次点击时 paymentDao.updateByVersion(payment) 的返回值为1 ,此时可以调用银行接口;当第二次点击时updateByVersion的返回值为 0 ,不会调用银行接口,实现了幂等性。

    展开全文
  • 分布式系统接口如何保证幂等

    万次阅读 2020-08-15 18:32:14
    分布式系统接口如何保证幂等性 接口幂等性 为了防止上述情况的发生,我们需要提供一个防护措施,对于同一笔支付信息如果我其中某一次处理成功了,我虽然又接收到了消息,但是这时我不处理了,即保证接口的 幂等性。 ...
  • 拟环中幂等元和半幂等元 (1996年)
  • 目的 把幂等变换与对合变换,幂等矩阵与对合矩阵统一起来并加以推广。方法 以k-余变换与k-余矩阵为工具,并采用对比分析的方法。结果/结论 引入了k次幂等变换和k次幂等矩阵的定义,给出了它们的性质和等价条件。
  • 关于幂等和非幂等

    2019-11-14 21:17:16
    对于同一种行为,如果执行不论多少次,最终的结果都是一致相同的,就称这种行为是幂等的。 (个人理解:不管是一次,还是多次操作,我们返回同样的结果,且不修改状态信息,接口可重复调用) 非幂等: 对于同一...
  • 分布式系统的接口幂等性设计

    万次阅读 2020-08-16 02:26:47
    分布式系统的接口幂等性设计 在微服务架构下,我们在完成一个订单流程时经常遇到下面的场景: 一个订单创建接口,第一次调用超时了,然后调用方重试了一次 在订单创建时,我们需要去扣减库存,这时接口发生了...
  • Java幂等性-http幂等

    2020-06-29 00:36:56
    一、什么是幂等性?什么是幂等操作? 幂等:是一个数学概念,表示N次变换和1次变换的结果相同。 幂等操作:其特点是任意多次执行所产生的影响均与一次执行的影响相同(不会改变资源状态,对数据没有副作用)。 ...
  • 什么叫幂等?如何实现幂等性?

    千次阅读 2020-12-18 12:55:16
    转载自:什么叫幂等?如何实现幂等性? 非商业转载,如有侵权,可联系本人删除 什么叫幂等?如何实现幂等性? 什么是幂等性? 幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两次...
  • 幂等和非幂等

    2018-10-27 22:53:01
     对于同一种行为,如果执行不论多少次,最终的结果都是一致相同的,就称这种行为是幂等的。  (个人理解:不管是一次,还是多次操作,我们返回同样的结果,且不修改状态信息,接口可重复调用)  ...
  • 幂等和非幂等的理解

    2019-02-15 21:48:00
    幂等和非幂等的理解 概念: 在web中的:(下面描述讲解的是web) 幂等: 对于同一种行为,如果执行不论多少次,最终的结果都是一致相同的,就称这种行为是幂等的。 (个人理解:不管是一次,还是多次操作,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,497
精华内容 4,198
关键字:

幂等