分布式系统面试 - 幂等性设计

面试题

分布式服务接口的幂等性如何设计(比如不能重复扣款)?

面试官心理分析

从这个问题开始,面试官就已经进入了实际的生产问题的面试了。

一个分布式系统中的某个接口,该如何保证幂等性?这个事儿其实是你做分布式系统的时候必须要考虑的一个生产环境的技术问题。啥意思呢?

你看,假如你有个服务提供一个接口,结果这服务部署在了 5 台机器上,接着有个接口就是付款接口。然后人家用户在前端上操作的时候,不知道为啥,总之就是一个订单不小心发起了两次支付请求,然后这俩请求分散在了这个服务部署的不同的机器上,好了,结果一个订单扣款扣两次。

或者是订单系统调用支付系统进行支付,结果不小心因为网络超时了,然后订单系统走了前面我们看到的那个重试机制,咔嚓给你重试了一把,好,支付系统收到一个支付请求两次,而且因为负载均衡算法落在了不同的机器上,尴尬了。。。

所以你肯定得知道这事儿,否则你做出来的分布式系统恐怕容易埋坑。

面试题剖析

这个不是技术问题,这个没有通用的一个方法,这个应该结合业务来保证幂等性。

所谓幂等性,就是说一个接口,多次发起同一个请求,你这个接口得保证结果是准确的,比如不能多扣款、不能多插入一条数据、不能将统计值多加了 1。这就是幂等性。

其实保证幂等性主要是三点:

  • 对于每个请求必须有一个唯一的标识,举个栗子:订单支付请求,肯定得包含订单 id,一个订单 id 最多支付一次,对吧。
  • 每次处理完请求之后,必须有一个记录标识这个请求处理过了。常见的方案是在 mysql 中记录个状态啥的,比如支付之前记录一条这个订单的支付流水。
  • 每次接收请求需要进行判断,判断之前是否处理过。比如说,如果有一个订单已经支付了,就已经有了一条支付流水,那么如果重复发送这个请求,则此时先插入支付流水,orderId 已经存在了,唯一键约束生效,报错插入不进去的。然后你就不用再扣款了。

实际运作过程中,你要结合自己的业务来,比如说利用 redis,用 orderId 作为唯一键。只有成功插入这个支付流水,才可以执行实际的支付扣款。

要求是支付一个订单,必须插入一条支付流水,order_id 建一个唯一键 unique key。你在支付一个订单之前,先插入一条支付流水,order_id 就已经进去了。你就可以写一个标识到 redis 里面去,set order_id payed,下一次重复请求过来了,先查 redis 的 order_id 对应的 value,如果是 payed 就说明已经支付过了,你就别重复支付了。

转载来源:https://github.com/doocs/advanced-java/blob/master/docs/distributed-system/distributed-system-idempotency.md

分布式系统面试 - 幂等性设计相关推荐

  1. 【案例分析】分布式系统的接口幂等性设计!

    概念 幂等性, Idempotence, 这个词来源自数学领域, 百科 上一元运算的幂等性解释如下:设 f 为一由 {x} 映射至 {x} 的一元运算, 则 f 为幂等的, 当对于所有在 {x} 内的 ...

  2. 分布式系统面试 - 常见问题

    分布式系统面试 - 常见问题 有一些同学,之前呢主要是做传统行业,或者外包项目,一直是在那种小的公司,技术一直都搞的比较简单.他们有共同的一个问题,就是都没怎么搞过分布式系统,现在互联网公司,一般都是 ...

  3. 分布式系统面试连环炮

    分布式系统面试连环炮 有一些同学,之前呢主要是做传统行业,或者外包项目,一直是在那种小的公司,技术一直都搞的比较简单.他们有共同的一个问题,就是都没怎么搞过分布式系统,现在互联网公司,一般都是做分布式 ...

  4. 深度介绍分布式系统原理与设计

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 1 概念 1.1 模型 1.2 副本 1.3 衡量分布式系 ...

  5. batchsize一定是2的幂_支付接口的幂等性设计

    1. 什么是幂等性? 在数学中的幂等性定义: 在某二元运算下,幂等元素是指被自己重复运算(或对于函数是为复合)的结果等于它自己的元素.例如,乘法下唯一两个幂等实数为0和1. 即 s * s = s 某 ...

  6. 高并发面试 - 如何设计一个高并发系统?

    高并发面试 - 如何设计一个高并发系统? 面试题 如何设计一个高并发系统? 面试官心理分析 说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了.为啥?因为你没看到现在很多公司招聘的 JD 里 ...

  7. 后端开发之接口幂等性设计

    一.天天在写Bug,好难哦           今天晨会结束后,领导叫上了陈同学,到会议室说,小陈啊,我现在手头有一个比较紧急的任务,需要你帮忙处理下.大致的情况是项目二组领导找他了,需要我们这边提供 ...

  8. 接口设计之幂等性设计

    幂等性设计 今天我们来聊聊接口的幂等性设计,所谓幂等,就是任意多次执行所产生的影响均与一次执行的影响相同. 幂等性接口是指可以使用相同参数重复执行,并能获得相同结果的接口.这里就不展开数学中的定义了, ...

  9. 如何避免重复提交?分布式服务的幂等性设计!

    原文:www.cnblogs.com/QG-whz/p/10372458.html 为什么需要保证幂等性 编程中的"幂等性"是指任意多次执行所产生的影响,与一次执行的影响相同.一个 ...

最新文章

  1. 【跟我一起学Unity3D】做一个2D的90坦克大战之AI系统
  2. Android 进程常驻(5)----开机广播的简单守护以及总结
  3. 指针常量、常量指针和常量指针常量
  4. 聊天宝解散罗永浩退出;三大运营商回应提速降费;天猫 iPhone XS 最高降 2000 | 极客头条...
  5. 关于function
  6. ARM寄存器的操作方法
  7. 软件工程项目迭代周报(一)
  8. 2022企业邮箱登陆入口介绍,企业邮箱电脑版登陆入口有哪些?手机如何登陆企业邮箱?
  9. 计算机二级c语言大题答题步骤,全国计算机等级考试二级c语言上机答题技巧
  10. matlab多项式除法 分式展开,多项式除法有一种处理假分式的方法叫多项式除 – 手机爱问...
  11. 都说谷歌浏览器翻译插件好用,这些必不可少
  12. 京东云php环境配置,干货 | 京东云应用负载均衡(ALB)多功能实操
  13. java快递管理系统
  14. python控制浏览器脚本_Chrome 33+浏览器 Cookies encrypted_value解密脚本(python实现)...
  15. C++信号量实现线程间同步,windows使用SetEvent,linux使用sem_t,QT测试
  16. react+antd实现图片上传并且剪裁(请参照最新文章,此案例有bug)
  17. 结合Vue实现344分割手机号码
  18. [展览人周刊]华展云20170731期
  19. elementUI calendar日历事例
  20. C# WPF TabControl控件用法详解

热门文章

  1. UIActionSheet与UIAlertView
  2. php实现url伪静态化,全过程详解
  3. 打包(归档)和压缩(包含两者的区别)
  4. 【三维深度学习】多视角场景点云重建模型PointMVS
  5. 【语义分割】论文代码资料汇总
  6. CSDN 代码不能语法高亮的原因
  7. 草稿 0242 ktv第一个页面
  8. windows系统如何进入环境变量
  9. 演练 影视演员简介 0929
  10. 前端开发 什么是网页 什么是html