朱赟的技术管理课
朱赟
计算机博士,前 Airbnb 技术经理
48935 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
时长 13:23
时长 13:31
朱赟的技术管理课
15
15
1.0x
00:00/00:00
登录|注册

06 | 每个工程师都应该了解的:聊聊幂等

确保唯一性(Uniqueness Guarantee)
幂等令牌(Idempotency Key)
多层幂等的问题
请求重试的处理
竞争条件
令牌误删的可能性
幂等令牌的产生和识别
去重的机制
REST API 中的难点之一
在大型互联网应用和企业级架构中都很重要
语义范畴对行为结果的定义
操作多次执行的影响与一次执行的影响相同
实现中的问题
幂等的实现
幂等的重要性
什么是幂等
幂等性(Idempotency)

该思维导图由 AI 生成,仅供参考

什么是幂等(Idempotency)呢?简单来说,一个操作如果多次任意执行所产生的影响,均与一次执行的影响相同,我们就称其为幂等。
这样说来,似乎很容易理解;但要知道这样的定义,其实是一个语义范畴对行为结果的定义。
如何用语法和规则去确保行为能达到这个结果,往往需要很谨慎地设计和实现。实际系统中,幂等是一个极为重要的概念,无论是在大型互联网应用还是企业级架构中,都能见到 REST API 被越来越多地采用,而正确实现幂等,往往是 API 中最难的技术点之一。
先说说为什么重要,我来举一个简单易懂的例子。
比如,你要处理一次电商网站收款或者付款的交易。当你给微信支付发送这个付款请求后,一个顺利的场景是不会有任何错误发生的,微信支付收到你的付款请求,处理所有转账,然后返回一个 HTTP 200 消息表示交易完成。
那如果发出请求后,有个请求超时,你再也没有收到关于这个请求是成功还是失败的回执,又该如何呢?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

幂等在工程设计中的重要性不言而喻。无论是大型互联网应用还是企业级架构,都离不开对幂等概念的理解和正确实现。幂等的定义是一个操作多次执行所产生的影响与一次执行的影响相同。在实际系统中,正确实现幂等往往是API中最困难的技术之一。文章通过举例说明了幂等的应用场景和实现方法,强调了幂等在处理请求重试、竞争条件和多层幂等方面的重要性。同时,文章还指出了实现幂等时容易出现的问题,如幂等令牌的产生和误删可能、竞争条件以及对请求重试的处理等。总之,幂等是一个语义范畴上对行为结果的定义,需要在设计和实现中极为谨慎,任何漏洞或Bug都可能导致系统出现各种问题。文章内容深入浅出,为工程师们提供了对幂等概念的全面了解和实际应用指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《朱赟的技术管理课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(25)

  • 最新
  • 精选
  • J
    如何测试是否达到幂等呢?是否存在一些方法论呢?特别是在大量使用开源软件等第三方技术和平台的时候,如果不是很清楚里面的坑,心里特别没底,但是我们没有那么多精力深入每一个细节。
    2017-11-24
    1
    19
  • 马洪博
    这里说的数据库“竞争条件”就是“脏读”吧。打个比方: 小张和小华同时喜欢上小芳,小张在探得小芳未婚后首先展开追求,并确定了关系。小华在几经打探确定小芳未婚后也打算采取行动,但在他准备行动的过程中小张和小芳闪婚了,使得上次的打探结果无效。 简单来说大概是“你读的时候并不知道别人也已经读过并已经采取了一些行动,只是行动尚未达成,对你不可见而已”
    2018-06-10
    2
    13
  • huangzhimim
    第一次听到这样的概念,学到了
    2017-11-30
    7
  • myaniu
    6年前曾设计了一个发短信然后银联自动给校园一卡通充值的系统,当时就是使用消息驱动,基于事物ID的幂等性,超时重发机制处理错误,最终效果不错。
    2017-11-28
    7
  • 王宇熙
    例子中,幂等令牌的生成,不应该客户端完成,客户端只能保证单机幂等令牌的唯一性,不能保证全站幂等令牌的唯一性。
    2018-05-10
    1
    6
  • alex
    做消息队列的consumer时候,特别要重视幂等信,保证相同的消息不论监听到多少次,也只能做处理一次
    2017-12-04
    5
  • Sam_Deep_Thinking
    幂等操作确实很重要,除了文章支付的例子之外,像购物车占用库存操作,也是需要幂等的,不然可能出现超卖少卖现象。
    2017-11-24
    5
  • 小沫
    重复执行工单,多次下发操作数据 也会出现幂等情况。需要增加操作令牌以保证同一个资源数据只能操作一次
    2017-11-27
    3
  • wade2999
    我来尝试回答一下,为什么只是读检查会发生race condition,而只有写入database as primary key才可以正确的检查到是否是相同的idempotency key: 考虑一个用户第一次发出了请求,但是超时了,然后他接着发出了第二次请求,但是第一个请求由于网络堵塞的原因,这个时候才跟第二个请求同时到达服务器。我server端的逻辑是: try { db.get(idempotencyKey); } catch (ObjectNotFoundException e) { processPayment; db.write(idempotencyKey); } 那么在上述的情况下,第一个跟第二个请求都会进入到exception的处理逻辑处,然后process payment。就会发生重复,即使是我后面只成功写入db一个order record。(因为primary key constrains idempotency id)。 那么如果修改成 try { db.write(idempotencyKey); processPayment; } catch (WriteException e) { return "success"; } 这样只有成功写入idempotencykey到db之后才可以处理payment,否则会返回该order已经成功处理
    2018-11-05
    2
  • 王岩
    不光是互联网支付,其实企业内部的对外支付也是一样,只要把微信服务端替换成银行就行了
    2017-11-27
    2
收起评论
显示
设置
留言
25
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部