分布式开发中的幂等性问题

分布式开发中的幂等性问题

什么是幂等性

在分布式系统中大多为SOA,或者微服务,多个系统之间服务到调用主要采用RPC或restful 这两种主流方式调用,既然是通信,那么存在一定风险导致返回处理结果的时候服务down掉,客户端没有感知,会多次点击按钮,这样多次请求,就要要求系统处理的结果统一,比如支付扣款。
幂等性 :用户对于同一操作发起多次请求,请求的结果是一致的,不会因为多次点击而产生副作用。主要出现在数据库的增加和修改场景中。

如何设计接口才能做到幂等性

  1. 使用ticketID
    单次支付请求,也就是直接支付了,不需要额外的数据库操作了,这个时候发起异步请求创建一个唯一的ticketId,就是门票,这张门票只能使用一次就作废,具体步骤如下:

    1.异步请求获取门票

    2.调用支付,传入门票

    3.根据门票ID查询此次操作是否存在,如果存在则表示该操作已经执行过,直接返回结果;如果不存在,支付扣款,保存结果

    4.返回结果到客户端

    如果步骤4通信失败,用户再次发起请求,那么最终结果还是一样的.

  2. 分布式环境下各个服务互相调用该
    这边就要举例我们的系统了,我们支付的时候先要扣款,然后更新订单,这个地方就涉及到了订单服务以及支付服务了。

    用户调用支付,扣款成功后,更新对应订单状态,然后再保存流水。

    而在这个地方就没必要使用门票ticketId了,因为会比较闲的麻烦

    (支付状态:未支付,已支付)

    步骤:

    1、查询订单支付状态

    2、如果已经支付,直接返回结果

    3、如果未支付,则支付扣款并且保存流水

    4、返回支付结果

    如果步骤4通信失败,用户再次发起请求,那么最终结果还是一样的

    对于做过支付的朋友,幂等,也可以称之为冲正,保证客户端与服务端的交易一致性,避免多次扣款。

猜你喜欢

转载自blog.csdn.net/u013719012/article/details/84746362