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

面试题

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

面试官心理分析

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

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

你看,假如你有个服务提供一个接口,结果这服务部署在了 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. 走进Java 7模块系统
  2. 函数用计算机代码,用main函数传参做简单的计算器的代码
  3. Oracle ASM 详解
  4. 【Linux】一步一步学Linux——lastb命令(99)
  5. IntelliJ IDEA for Mac 如何在当前的普通Java项目中创建新的模块/添加模块/创建模块
  6. NLP实战-中文命名实体识别
  7. C++_类和对象_C++继承_同名静态成员处理_父类子类中存在同名静态成员变量_同名静态成员函数时的处理方法---C++语言工作笔记066
  8. Eclipse下PHP开发 插件安装
  9. IOS判断用邮箱登录验证是不是合法的方法
  10. 《大清重臣李鸿章·上下》—— 读后总结
  11. python识别火车票二维码_python实现12306查询火车票
  12. “三门问题”的理解和Python验证
  13. javascript获取非行间样式的函数封装
  14. 粒子群算法组卷_概率表示的二进制粒子群算法在组卷中的应用
  15. 3.2 电话号码对应英语单词
  16. 基于STM32的智慧矿山之矿井安全监控终端的设计与实现
  17. CreateCompatibleDC,CreateCompatibleBitmap,SelectObject详解
  18. QT信号和槽机制分析
  19. 基于JMP的分类资料组间比较的卡方检验
  20. vue开发android tv,vue-tv-focusable中文文档

热门文章

  1. Linux/Ubuntu: 命令行任务(To-Do List)管理 task - A command line todo manager
  2. CodeIgniter 合作 Authorize.net
  3. Python与数据库(2)Oracle
  4. MySQL的Limit性能问题
  5. STM32的启动文见分析
  6. LeetCode 563. Binary Tree Tilt
  7. ICLR2019 论文清单
  8. 9203 0409 随堂
  9. pptx模块的安装与基本使用
  10. 安装django库 指定2.0版本