一、简介
一般来说对于后端接口的幂等控制有多版本控制(适用于更新场景,在更新接口中加一个版本号,执行更新操作时校验版本号)、状态机控制(适用于在有状态机流转的情况下做幂等控制,类似于多版本控制)以及去重表等方法。
二、基于mysql的去重表接口幂等控制
1、创建去重表
去重表只需要有requestid,创建时间,更新时间三个字段即可,requestid作为主键。
--幂等表
DROP TABLE IF EXISTS `t_unique`;
CREATE TABLE `t_unique` (
`requestId` varchar(64) NOT NULL COMMENT 'requestId',
`gmtCreate` TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
`gmtUpdate` TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '更新时间',
PRIMARY KEY (`requestId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2、校验逻辑
对于需要做幂等的接口,在前端请求时服务端即生成一个随机的requestid返回给前端,前端表单提交的同时将requestid同时提交。接口对requestid进行校验。
校验逻辑是:将requestId插入去重表,如果插入成功则说明接口是第一次访问,返回没有被幂等。同时需要捕获异常,出现异常并不一定是去重表里有数据,可能是事务隔离级别导致,所以要到去重表去查一次确认数据是否存在,如果不存在相应数据则抛出异常让接口重试,如果数据存在则返回接口被幂等。