如何处理接口的重复请求

作者: Djbfifjd | 来源:发表于2019-04-28 23:09 被阅读46次

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

问题背景

一个分布式系统中的某个接口,该如何保证幂等性?做分布式系统的时候,这是一个必须要考虑的生产环境的技术问题。
假如你有个服务提供一个接口,结果这服务部署在了 5 台机器上,接着有个接口就是付款接口。然后人家用户在前端上操作的时候,不知道为啥,总之就是一个订单不小心发起了两次支付请求,然后这俩请求分散在了这个服务部署的不同的机器上,结果一个订单扣款扣两次。
或者是订单系统调用支付系统进行支付,结果不小心因为网络超时了,然后订单系统走了前面我们看到的那个重试机制,支付系统收到一个支付请求两次,而且因为负载均衡算法落在了不同的机器上,尴尬了。。。
所以你肯定得知道这事儿,否则你做出来的分布式系统恐怕容易埋坑。

问题剖析:

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

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

实际运作:

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

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

相关文章

  • 如何处理接口的重复请求

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

  • vue_axios请求封装、异常拦截统一处理

    1、前端网络请求封装、异常统一处理 vue中采用axios处理网络请求,避免请求接口重复代码,以及各种网络情况造成...

  • postman使用

    1.如何判断接口是否请求成功 2.如何进行接口批量、定期测试 3.如何处理依赖接口问题(比如商品下单的接口必须要求...

  • 处理重复请求

    在我们的日常开发当中,很多时候会出现短时间内接口重复请求的情况,如果没有妥当地处理,很可能会造成以下的影响: 对于...

  • Retrofit2.5如何发送请求和处理响应?

    Retrofit对请求方法的解析 Retrofit对我们在接口类中定义的方法是如何转换成了请求,又如何处理响应。这...

  • 如何优雅地处理重复请求(并发请求)

    利用唯一请求编号去重 你可能会想到的是,只要请求有唯一的请求编号,那么就能借用Redis做这个去重——只要这个唯一...

  • 2018 iOS面试题目总结

    一、未分类面试题目 1.如何更好的处理缓存问题? 2.多接口请求是如何处理? 3.NSCash 和 NSDicti...

  • 处理重复请求的心得

    在很多业务场景我们会有重复请求的校验处理常见解决办法基本都是用数据库的唯一索引来处理,但其实这么做对于一个成熟的项...

  • 责任链模式

    抽象责任链处理者 抽象责任链处理者实现类 请求抽象类或接口 请求抽象类或接口实现类 场景使用

  • 处理用户发送的get和post请求

    如何处理用户发送的get请求 如何处理用户发送的post请求

网友评论

    本文标题:如何处理接口的重复请求

    本文链接:https://www.haomeiwen.com/subject/esbsnqtx.html