V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
twogoods
V2EX  ›  程序员

问问关于幂等的问题

  •  
  •   twogoods · 2016-12-08 09:10:53 +08:00 · 2975 次点击
    这是一个创建于 2908 天前的主题,其中的信息可能已经有所发展或是发生改变。
    /t/325814 ,这个里的问题可以说是一个幂等问题吗?生成订单的接口按理说用户请求自然要生成订单啊。能举个非常棒的需要幂等的例子吗?看过一个点赞的例子说点几次都相当于点一次,点多次你是都提示它成功还是提示已经点过了?
    11 条回复    2016-12-09 03:04:24 +08:00
    yuankui
        1
    yuankui  
       2016-12-08 09:18:32 +08:00
    我们说幂等的时候,都有一个隐含前提:
    一个消息(或者请求)有一个标识字段类唯一地标识这个请求。

    拿点赞的例子,这个唯一地标识就可以是: 帖子 ID + 点赞人 ID
    拿下单的例子,可能就是订单号

    如果没有这个标识,就要想法创造这个标识

    没有标识你来说幂等?天方夜谭啊
    crossoverJie
        2
    crossoverJie  
       2016-12-08 09:19:15 +08:00
    正好我现在正做一个幂等的业务:一个商户接入我们的系统首先要他传一个订单过来,之后我们这边会判断这个订单是否存在,如果不存在就创建该订单,因为这个业务是创建订单之后会有一个 step 状态,第一次创建状态就是 0 也就是新建。如果存在的话就返回该订单所在的 step 状态。之后这个 step 状态会在运营的接入下进行更新,每次商户如果需要查询订单状态的话也会反复请求我这个接口然后返回信息给他,不知道明白了没有,这是我所理解的。
    enenaaa
        3
    enenaaa  
       2016-12-08 09:21:50 +08:00
    比如 get 一个静态文件, 比如你点感谢, 就算你手动发 n 次感谢的请求, 也只算一次。
    kaneg
        4
    kaneg  
       2016-12-08 09:43:39 +08:00 via iPhone
    个人理解幂等是对于只读的资源的请求,无论多少次请求都不会对该资源造成影响,比如 get 。而对于带写操作的请求,比如 post , put , delete 都不是幂等的
    lhbc
        5
    lhbc  
       2016-12-08 09:51:47 +08:00 via iPhone
    从购物车创建订单就可以保证幂等了。
    购物车数据提交到服务器保存,创建订单后删除购物车里的相应商品,重复提交就不会产生多个订单。

    post, put, delete 都可以幂等,看你程序是否实现
    比如 v2 对某个回复或帖子感谢
    tinyproxy
        6
    tinyproxy  
       2016-12-08 10:04:04 +08:00 via iPhone
    @kaneg POST 等也有幂等,不管请求 n 次,对应的业务逻辑代码只执行一次
    liuxu
        7
    liuxu  
       2016-12-08 10:35:10 +08:00
    wubotao
        8
    wubotao  
       2016-12-08 10:45:49 +08:00
    我看成了「关于杨幂的问题」。。。 😄 😄 😄
    twtiyb
        9
    twtiyb  
       2016-12-08 16:56:57 +08:00
    幂等。。执行一次,执行多次。效果一样。
    ihuotui
        10
    ihuotui  
       2016-12-08 21:35:51 +08:00
    还有一种情况是,幂等是有时效性,各大网站的缓存,就是一定时间内幂等。
    SoloCompany
        11
    SoloCompany  
       2016-12-09 03:04:24 +08:00
    幂等不仅仅是描述事务,还包括行为
    比如,按 ID 删除是典型的幂等操作
    如果 API 设计为,删除成功返回 true ,记录不存在返回 false
    那么这个 API 接口就不是幂等的
    幂等的接口要求不管多少次调用,返回状态都无法区分

    所以,防止多次提交和幂等并不完全是一回事,但幂等操作肯定不存在重复提交问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2855 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 09:10 · PVG 17:10 · LAX 01:10 · JFK 04:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.