分布式服务接口的幂等性如何设计(比如不能重复扣款)?
面试题
分布式服务接口的幂等性如何设计(比如不能重复扣款)?
面试官心理分析
从这个问题开始,面试官就已经进入了实际的生产问题的面试了。
一个分布式系统中的某个接口,该如何保证幂等性?这个事儿其实是你做分布式系统的时候必须要考虑的一个生产环境的技术问题。啥意思呢?
你看,假如你有个服务提供一个接口,结果这服务部署在了 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://www.javazhiyin.com/23010.html
相关文章
- loadrunner做webservice接口之简单调用
- 在接口测试中如何应对需求的频繁变化
- .net 反射访问私有变量和私有方法 如何创建C# Closure ? C# 批量生成随机密码,必须包含数字和字母,并用加密算法加密 C#中的foreach和yield 数组为什么可以使用linq查询 C#中的 具名参数 和 可选参数 显示实现接口 异步CTP(Async CTP)为什么那样工作? C#多线程基础,适合新手了解 C#加快Bitmap的访问速度 C#实现对图片文件的压
- 接口自动化测试用例如何设计?
- 如何用postman实现接口自动化测试
- 有趣的USB接口和颜色分类
- 给定一个接口,测试人员应该如何测试?
- 软件测试/测试开发 | 接口自动化测试中,如何做断言验证?
- postman+jmeter接口实例
- Jmeter接口自动化-如何解决请求头Content-Type冲突问题
- 新手测开如何在公司从零开始搭建接口自动化平台?
- 如何实现基于场景的接口自动化测试用例?来看看大佬的方案
- JMeter中如何实现接口之间的关联?
- 接口数据总是返回 null 如何回馈和处理
- 微信分享接口绕过方式
- Delphi判断某个类是否实现了某个接口
- S5pv210下 HDMI 接口在 Linux 3.0.8 内核下的驱动解析
- SpringBoot启动过程中涉及到了扩展接口
- Vue3结合TS项目开发实践:Composition API的风格理念、关注点分离、如何组织TS进行项目开发(采用声明文件来管理接口及所需类型/目录结构推荐)
- Java面向对象基础知识笔记:方法、构造方法、方法重载、继承、多态、抽象类、接口、静态字段与静态方法、包、作用域、classpath与jar、模块依赖关系
- Mybatis中 Dao接口和XML文件的SQL如何建立关联
- 【Business Touch Kit】服务号消息发送接口返回401如何解决?
- RobotFramework做接口自动化(内部接口需要登录token)
- 利用unittest+ddt进行接口测试(一):简单demo
- 记录python接口自动化测试--根据excel中的期望输出是否存在请求返回的响应来判断用例是否执行成功(第八目)