分布式系统中的幂等性

分布式系统中的幂等性

1.幂等性介绍

幂等的概念来自数学,比如对于一元函数来说满足:f(f(x))=f(x)

即可称为满足幂等性

在计算机科学中,一个操作如果多次执行产生的影响与一次执行产生的影响相同,这样的操作即符合幂等性

在分布式系统中,服务消费方调用服务提供方的接口,多次调用的结果应该与一次调用的结果一样,这正是分布式环境下幂等性的语义。

为什么幂等性对于分布式系统而言如此重要?

因为子啊分布式环境下,服务调用方一般采用http协议或rpc或MQ的方式,即双方需要通过网络进行通信,而因为网络故障或者消息超时的存在,可能服务消费方已经成功调用了服务提供方的服务接口,但是消费方没有收到来自对方的成功响应,导致消费方以为服务调用失败从而再次进行调用,也就是网络的不可靠性导致了服务接口被多次调用的可能。

分布式系统必须保证在这种情况下,即使接口被多次调用,它对系统产生的影响应该与该接口只被调用一次的结果一样

2.幂等性场景

在微服务架构下,不同的微服务间会有大量的基于http,rpc或MQ消息的网络通信,接口的重复调用以及消息的重复消费可能会经常发生,比如以下情况

  • 调用订单创建接口,第一次调用超时,调用方又尝试了一次,但其实第一次调用已经成功,只是调用方没有及时收到响应
  • 订单支付成功后,需要向MQ发送一条消息,但该消息重复发送两条
  • 网络波动导致服务方的接口被调用了两次
  • 用户在使用产品时,无意地触发多笔交易
  • 某些未关闭的重试机制

微服务架构应该具有幂等性,当接口被重复调用时,消息被重复消费时,对系统的产生的影响应该和接口被调用一次,消息被消费时一样

3.crud操作的幂等性分析

  • 新增请求:不具备幂等性
  • 查询请求:重复查询不会影响系统状态,查询天然具有幂等性
  • 基于主键的更新请求
    要更新的值依赖于前值,不具备幂等性
    要更新的值不依赖于前值,具有幂等性
  • 删除请求
    基于主键的物理删除具有幂等性
    基于主键的逻辑删除也具有幂等性

总结:通常只需要对新增请求和更新请求作幂等性保证

4.如何解决幂等性问题

  • 全局唯一ID
    根据业务生成一个全局唯一ID,在调用接口时会传入该ID,接口提供方会从相应的存储系统,比如redis中去检索这个全局ID是否存在,如果存在则说明该操作已经执行过了,将拒绝本次服务请求;否则将相应该服务请求并将全局ID存入存储系统中,之后包含相同业务ID参数的请求将拒绝
  • 去重表
    这种方法适用于在业务中有唯一标识的插入场景。比如支付场景中,一个订单只会支付一次,可以建立一张去重表,将订单ID作为唯一索引。把支付并且写入支付单据到去重表放入一个事务中,这样当出现重复支付时,数据库就会抛出唯一约束异常,操作就会回滚。这样保证了订单只会被支付一次
  • 多版本并发控制
    适合对更新请求作幂等性控制,比如要更新商品的名字,这是就可以在更新的接口中增加一个版本号来做幂等性控制
  • 状态机控制
    适合有状态机流转情况下,比如订单的创建和付款,订单的创建肯定是在付款之前。这是可以添加一个int类型的字段来表示订单状态,创建状态为0,付款成功为100,付款失败为99。
  • 插入或更新
    在MySQL数据库中,如果insert语句后面带上ON DUPLICATE KEY UPDATE子句,而要插入的行与表中现有记录的唯一索引或者主键索引产生重复值,则对旧值进行更新;否则执行新纪录的插入
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在设计分布式系统接口的幂等性时,可以采取以下策略: 1. 使用唯一标识符:为每个请求生成唯一的标识符(例如UUID),将该标识符作为请求的一部分,在服务端进行幂等性校验时使用。服务端可以通过记录已处理请求的标识符,避免对同一请求的重复处理。 2. 幂等性检测:在服务端对接口请求进行处理之前,检测该请求是否已经被处理过。可以通过查询数据库、缓存或日志等方式来判断该请求是否已经被处理。如果已经被处理过,则直接返回之前的结果,避免重复处理。 3. 乐观锁机制:在处理接口请求时,使用乐观锁来保证操作的原子性和幂等性。通过在数据记录添加版本号或时间戳等字段,当多个请求并发操作同一数据时,只有一个请求能够成功执行,其他请求会失败并返回适当的结果。 4. 幂等性响应标识:在接口响应返回一个唯一的标识符,该标识符可以用于客户端判断该请求是否已经被成功处理过。客户端可以保存该标识符,并在后续的请求将该标识符传递给服务端,以确保幂等性。 5. 事务处理:在进行涉及状态更新的操作时,使用事务来保证操作的原子性和幂等性。如果操作失败,事务会回滚到之前的状态,避免对同一请求的重复处理。 以上是一些常见的设计策略,可以根据具体系统的需求和特点选择适合的幂等性设计方式。同时,还需要注意在接口文档明确指定接口的幂等性要求,以便开发人员正确使用和处理接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值