如何做幂等
访问量不大用幂等表,量大用redis
幂等
幂等广义上一般指以相同参数调用同一个接口多次,对系统内部产生的影响是一致的。比如说进行支付时,如果一次扣款操作因为某种原因调用了两次,那么理论上应该只生效一次,否则就会出现一定的风险。
如何做幂等
如果每次请求过来我们会根据它的请求参数或者其它特征生成一个唯一的标识,并把它存储起来,当下次请求再来时我们先去查询一下是否已经存在相同的标识记录,如果存在,那么忽略该次请求,否则先存储标识,然后再进行业务处理。这样其实就可以实现调用的幂等性控制,实际情况中我们可能会需要在数据库中创建一张幂等表来存储相关的标识。
原理很简单,但实际上真正实现起来是有一定难度的,比如说当前很多系统都是分布式的架构,数据库可能也是分库分表的,因此我们必须能够保证相同的标识必须能够落在同一张表内,否则依然无法保证接口的幂等性。当然,这些必须要根据业务来进行分析
CREATE TABLE `biz_idempotent_string` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`biz_type` smallint(5) unsigned NOT NULL COMMENT '业务类型,例如区分订单、抽奖等',
`op_type` tinyint(3) unsigned NOT NULL COMMENT '业务操作类型',
`biz_id` varchar(64) NOT NULL COMMENT '业务唯一id,例如订单id',
`sub_biz_id` varchar(64) NOT NULL COMMENT '子业务唯一id,例如优惠券id,用户id',
`ext` mediumtext COMMENT '扩展字段,json格式',
`create_time` datetime NOT NULL COMMENT '创建时间',
`modify_time` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_idx` (`biz_type`,`op_type`,`biz_id`,`sub_biz_id`) //重点作用幂等的关键
) ENGINE=InnoDB AUTO_INCREMENT=3307 DEFAULT CHARSET=utf8;