朱赟的技术管理课
朱赟
计算机博士,前Airbnb技术经理
立即订阅
11176 人已学习
课程目录
已完结 39 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 | 从工程师到管理者,我的思考与实践
免费
01 | 职场分身术:从给答案到做引导
02 | Bug引发事故,该不该追究责任?
03 | 每个工程师都应该了解的:A/B测试
04 | 如何帮助团队成员成长
05 | 当我们给别人提意见时,要注意些什么?
06 | 每个工程师都应该了解的:聊聊幂等
07 | 当别人给我们提意见时,该如何应对?
08 | 说说硅谷公司中的一对一沟通
09 | 每个工程师都应该了解的:大数据时代的算法
10 | 项目延期了,作为负责人该怎么办?
11 | 管理和被管理:期望值差异
12 | 每个工程师都应该了解的:数据库知识
13 | 管理者在进行工作分配时,会考虑哪些问题?
14 | 硅谷人到底忙不忙?
15 | 每个工程师都应该了解的:系统拆分
16 | 技术人如何建立个人影响力?
17 | 管理者不用亲力亲为:关键是什么?
18 | 每个工程师都应该了解的:API 的设计和实现
19 | 硅谷面试:那些你应该知道的事儿
20 | 项目管理中的三个技巧
21 | 每个工程师都应该了解的:中美在支付技术和大环境下的差异
22 | 不要做微观的管理者
23 | 如何处理工作中的人际关系?
24 | 编程语言漫谈
25 | 兼容并包的领导方式
26 | 如何做自己的职场规划?
27 | 小议Java语言
28 | 如何激发团队人员的责任心
29 | 说说硅谷互联网公司的开发流程
30 | 编程马拉松
31 | 工程师、产品经理、数据工程师是如何一起工作的?
32 | 硅谷人如何做 Code Review
33 | 技术人的犯错成本
34 | 如何从错误中成长?
35 | 理解并建立自己的工作弹性
36 | 如何对更多的工作说“不”
尾声:成长不是顿悟,而是练习
新书 |《跃迁:从技术到管理的硅谷路径》
朱赟的技术管理课
登录|注册

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

朱赟 2017-11-24
什么是幂等(Idempotency)呢?简单来说,一个操作如果多次任意执行所产生的影响,均与一次执行的影响相同,我们就称其为幂等。
这样说来,似乎很容易理解;但要知道这样的定义,其实是一个语义范畴对行为结果的定义。
如何用语法和规则去确保行为能达到这个结果,往往需要很谨慎地设计和实现。实际系统中,幂等是一个极为重要的概念,无论是在大型互联网应用还是企业级架构中,都能见到 REST API 被越来越多地采用,而正确实现幂等,往往是 API 中最难的技术点之一。
先说说为什么重要,我来举一个简单易懂的例子。
比如,你要处理一次电商网站收款或者付款的交易。当你给微信支付发送这个付款请求后,一个顺利的场景是不会有任何错误发生的,微信支付收到你的付款请求,处理所有转账,然后返回一个 HTTP 200 消息表示交易完成。
那如果发出请求后,有个请求超时,你再也没有收到关于这个请求是成功还是失败的回执,又该如何呢?
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《朱赟的技术管理课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(19)

  • J
    如何测试是否达到幂等呢?是否存在一些方法论呢?特别是在大量使用开源软件等第三方技术和平台的时候,如果不是很清楚里面的坑,心里特别没底,但是我们没有那么多精力深入每一个细节。
    2017-11-24
    17
  • 马洪博
    这里说的数据库“竞争条件”就是“脏读”吧。打个比方:
    小张和小华同时喜欢上小芳,小张在探得小芳未婚后首先展开追求,并确定了关系。小华在几经打探确定小芳未婚后也打算采取行动,但在他准备行动的过程中小张和小芳闪婚了,使得上次的打探结果无效。
    简单来说大概是“你读的时候并不知道别人也已经读过并已经采取了一些行动,只是行动尚未达成,对你不可见而已”
    2018-06-10
    9
  • huangzhimim
    第一次听到这样的概念,学到了
    2017-11-30
    6
  • myaniu
    6年前曾设计了一个发短信然后银联自动给校园一卡通充值的系统,当时就是使用消息驱动,基于事物ID的幂等性,超时重发机制处理错误,最终效果不错。
    2017-11-28
    4
  • 幻想
    幂等操作确实很重要,除了文章支付的例子之外,像购物车占用库存操作,也是需要幂等的,不然可能出现超卖少卖现象。
    2017-11-24
    4
  • alex
    做消息队列的consumer时候,特别要重视幂等信,保证相同的消息不论监听到多少次,也只能做处理一次
    2017-12-04
    3
  • 小沫
    重复执行工单,多次下发操作数据 也会出现幂等情况。需要增加操作令牌以保证同一个资源数据只能操作一次
    2017-11-27
    3
  • 王宇熙
    例子中,幂等令牌的生成,不应该客户端完成,客户端只能保证单机幂等令牌的唯一性,不能保证全站幂等令牌的唯一性。
    2018-05-10
    2
  • 王岩
    不光是互联网支付,其实企业内部的对外支付也是一样,只要把微信服务端替换成银行就行了
    2017-11-27
    2
  • wangtie
    学习了,分享给小伙伴们看看
    2017-11-24
    2
  • 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
    1
  • GeekAmI
    其实 我是第一次听说幂等的概念,虽然平常遇到很多幂等的问题
    2017-11-24
    1
  • 慧长青
    幂等的唯一性很重要,尤其是支付的场景
    2019-04-10
  • mikejiang
    幂等性我公司一般用第一种方法,但是,其实第二种我觉得也不错。无论是幂等令牌的实现,还是保证唯一性,都很容易实现有问题,大多倾向于很容易用读来判断是否有遇到过,这是有问题的。
    2019-02-28
  • Alexis何春光
    “making multiple identical requests has the same effect as making a single request. 我觉得需要强调事 是identical的,不然乍一看为什么多次请求只给我一个结果,会有点疑惑。个人意见~
    2018-12-25
  • 七-只顾风雨兼程
    要详细学习下
    2018-11-17
  • 周丽洁
    问一个细节问题,为什么不能读检查而要靠写入报错来判断唯一性?因为我认为按一般的逻辑,是去数据库里面查有没有这个唯一值。不太明白读与读之间有竞争这个原因。谢谢回复。
    2018-05-04
  • gggjtg
    能不能举个例子解释一下什么是竞争条件
    2018-03-13
  • walt
    大并发测试幂等
    2017-12-24
收起评论
19
返回
顶部