该系列课程都是以电商的的场景为例子,来讲解后端存储的一些实例。
因为网络、服务器等原因,重试成了我们必不可少的一种手段,这时就需要你提供的服务是幂等的。具有幂等的服务就可以完美克服重试导致的数据错误。
1、订单的存储如何实现幂等?
这不是前端应该做的嘛?幼稚了,哈哈哈,我们通常使用的 rpc 或者网关都有重试的功能,如果这种请求打到后端,还是会生成重复订单。
那要怎么认定重复订单呢?同一个用户信息?不可能啊,同一个用户可以下多次订单怎么办?
主键 id ?这个是每次插入生成的。
通常做法是这样的,创建订单的时候,前端页面先生成一个订单号,这样如果重复提交同一个订单号在后端数据库只能有一条记录,可以利用数据库的这个特性,实现记录的幂等性。
具体实现种有个需要注意的点:如果是因为重复创建导致的错误不要抛给前端,返回订单创建成功好了。
2、如何完美解决 ABA 的问题
先来陈述下这个问题:大概产生流程就是 记录从原始状态更新为 A ,
但是这个response 并没有成功触达调用方。导致调用方的重试,但是
这期间另一个请求已经将状态修改为了 B , 再次发起的 A更新操作当然会将
记录的状态更新为A 了。那么如何避免这个问题呢?
想必,你想到了,就是类似乐观锁的的操作,每次更新操作带上 version 字段,这就当然需要你数据库增加一列 version , 返回给调用方的查询结果也是带上 version ,这样更新操作就会带上这个字段执行更新操作。如果版本不对,就更新失败。
网友评论