4月更文d12n12-一种基于数据库的请求幂等性处理方案

133 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

一种基于数据库的请求幂等性处理方案

前文

幂等性是在处理请求时不得不考虑的一个常见问题,它主要指的是对于多次的数据操作,保证结果的一致性。这主要又分为两种请求,查询请求和更新、新建等操作请求,而幂等性的问题主要集中在新建请求上。本文主要讨论的解决方案,则是利用数据库索引的性质,实现新增请求的幂等性限制。

问题内容

幂等性问题是分布式系统中十分常见的一种问题。下面结合具体的场景进行一下幂等性原因的分析,其中内容不能保证完全正确,主要是个人对于幂等性内容的理解。

还原一下场景,首先这是一个分布式系统的应用,网关之后我们此处有三个处理数据新增的服务,三者之间属于完全相同的集群服务,无状态。前端利用鼠标进行连续点击,由于前端按钮未做连续点击限制,现在服务端同时收到了三条内容完全一致的新增请求。由于网关的负载均衡作用,三个请求分别被负载到三个服务中,这样也就生成了三条数据。由于数据库主键采用的自增主键,不适合修改,那么这种情况如何处理呢?

方案简述

首先会先到一种办法,采用数据库约束,不允许相同数据插入。但这种做法有一种问题,也就是当一条数据被删除后,我们已经无法插入相同的数据。那么能不能想办法解决一下这个问题呢?

当然有办法,不过不见得是最佳。本方案采用了一个额外字段。在新增时统一填充为默认值0,利用两个字段形成唯一索引。这样当多个相同数据的请求到达时,会由于数据库的约束实现幂等性。而对于删除后的数据,将该字段填充为随机数值,也就不会影响删除后数据的重新新增。至此,也就是本方案的具体解决思路。

对于幂等性的解决方案,有若干种实现。本方案并非最佳,只是在基于数据库自增主键的一种补救措施。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。