互联网业务幂等性实现之基于MySQL

网友投稿 1735 2023-06-14

互联网业务幂等性实现之基于MySQL

互联网业务幂等性实现之基于MySQL

背景

在互联网业务领域中,我们经常会遇到应用到请求幂等性问题,即多次重复请求,所得到的结果,和一次请求一致。

以某互联网电商的取消订单为例子,当订单取消,需要返回给消费者下单所消费的虚拟产品,如优惠券、红包、京豆等。通过幂等形式,确保返还给消费者的权益不多、不少。

那幂等性具体开发是怎么实现的呢?本文带来基于MySQL的UNIQUE KEY的实现方案。

实现

众所周知,UNIQUE KEY是数据库中的唯一索引,数据库的记录中不允许有重复的值,我们可以利用这点,在处理业务前,先进行唯一索引数据(如订单id)的插入操作:

插入成功,说明是第一次插入,正常处理业务;插入失败,说明该业务逻辑已经处理过了,不做处理,提前返回;

如此,即可实现幂等性。

1.数据库设计

幂等性辅助表设计如下:

CREATE TABLE `idempotent_validate` ( `id` bigint NOT NULL, `create_time` time DEFAULT NULL, `order_id` bigint DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `UK_orssam7fgn4uj0lo2sn4on6vg` (`order_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

其中的一个字段order_id,我们定义为唯一索引。

2.代码编写

我们主要实现了订单取消方法cancelOrder:

从代码中可以看到,我们在除了订单退款前,幂等性表先拿订单id进行插入操作,若插入成功,说明是第一次取消订单,执行下面的退款逻辑;

若插入失败,说明之前已经进行过退款逻辑了,我们提前返回,不做下面的退款操作。

如此,便实现了订单退款的幂等性。

3.测试

我们对订单进行3次取消操作:

可以看到,只有第一次是退款成功的,后面2次触发幂等性,退款失败,符合我们的预期。

其他

幂等性的实现方式还有很多种,基于MySQL的UNIQUE KEY的实现方案,实现起来相当简单,仅适合业务简单,并发量不高的场景。原因是MySQL的qps有限,且MySQL作为系统的最底层的应用,过于后置,如果最终幂等返回,比较浪费前置的业务处理所消耗的资源。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系小编 edito_r@163.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SQL 设计模式 | 关系型数据库的幂等性处理
下一篇:为什么我建议需要定期重建数据量大但是性能关键的表
相关文章