2023年(Q3财年)技术部门CTO线技术人员晋升考核机试题

分布式篇-G 分布式幂等架构设计

*参考答案*

出题人:湖北TL田超凡
答案制定:湖北TL田超凡

*****试卷启用前绝密****

1 幂等的基本概念

答:幂等指的是同一块业务逻辑重复多次执行时,只能令其生效一次,防止重复执行。

2 幂等的发生场景

答:

  1. RPC调用接口的幂等性问题
  2. MQ消费者防止重复消费的幂等性问题
  3. 定时任务防止重复执行的幂等性问题

3 RPC调用接口的幂等性问题产生背景

答:客户端向服务器端发送请求,服务器端一直不返回响应给客户端。客户端设置一个超时时间,当服务器端超过规定的时间还不返回响应给客户端时,就认为其已经超时。

服务器端超时,客户端会重试发送请求到服务器端,从而导致同一个接口可能被多次RPC调用的问题。

4 RPC调用接口的幂等性问题解决方案

答:分三种情况讨论:

  1. INSERT类型:将全局id作为主键插入到数据库表中,防止重复插入
  2. UPDATE类型:基于CAS乐观锁+版本号Version控制
  3. DELETE类型:大多数都不是物理删除,而是逻辑删除。逻辑删除本质还是UPDATE修改状态,所以也可以采用CAS乐观锁+版本号Version控制。

5 MQ消费者防止重复消费的幂等性问题解决方案

答:消息内容中新增一个全局消息id

MQ消费者接收到消息后,获取全局消息id,到数据库中查询

如果不存在,说明该消息没有被消费过,正常消费

如果已存在,说明该消息已经被消费过,不再重复消费,直接丢弃该消息。

6 定时任务防止重复执行的幂等性问题解决方案

答:

  1. 彻底解耦。将定时任务逻辑和业务逻辑实现彻底解耦分开,只对业务逻辑实现服务集群,不对定时任务逻辑实现服务集群(定时任务服务单机)
  2. 配置文件新增开关。服务启动时先读取该开关配置,如果配置了开启,则加载定时任务类、执行定时任务。如果配置了关闭,则不加载定时任务类、不执行定时任务。
  3. 数据库主键唯一性。多个服务同时插入相同主键id到同一个数据库表中,因为数据库表中的主键是由唯一约束的,所以只有一个服务能插入成功,谁插入成功谁就可以执行定时任务。
  4. 分布式锁。每个服务本质都是一个JVM,可以基于分布式锁机制实现:多个服务JVM同时获取分布式锁,同一时刻只有一个JVM能获取到分布式锁,谁获取到分布式锁,谁就可以执行定时任务。分布式锁的主流实现方案有两种:基于zookeeper实现分布式锁和基于redis实现分布式锁,可以根据实际业务场景的需要选择合适的实现方案。
  5. 分布式任务调度平台。同时解决定时任务高可用和幂等性问题。
07-14 12:14