系统接口幂等设计

1、根据需求本身可以设计出幂等键。如发奖:幂等键可以设计为 订单号+订单状态+活动ID

2、新增表单页幂等性设计方案:

先解释下必要性:用户重复点击创建订单按钮,避免生成两个订单。即使前端做了防抖设计,但是由于网关、框架一般具有retry 功能,后端做防抖还是很有必要性的。

方案:ID生成服务 + 数据库主键唯一 来保证幂等

用户进入生单页面时,请求 ID生成服务 生成幂等键,表主键设计为生成的ID,不使用自增ID,避免生成重复订单。

3、更新ABA问题。

ABA问题:

我举个例子你就明白了。比如说,订单支付之后,小二要发货,发货完成后要填个快递单号。假设说,小二填了一个单号666,刚填完,发现填错了,赶紧再修改成888。对订单服务来说,这就是2个更新订单的请求。
正常情况下,订单中的快递单号会先更新成666,再更新成888,这是没问题的。那不正常情况呢?666请求到了,单号更新成666,然后888请求到了,单号又更新成888,但是666更新成功的响应丢了,调用方没收到成功响应,自动重试,再次发起666请求,单号又被更新成666了,这数据显然就错了。这就是非常有名的ABA问题。

解决方案:DB增加version字段,更新时携带version字段,版本号相同时再进行更新。

全部评论
隔行如隔山都不会
点赞 回复 分享
发布于 昨天 21:06 北京

相关推荐

1. 自我介绍2. 问了一下项目3. cannal的作用和架构?4. Redis中用Lua脚本的优势或者好处?5. Redis内存满了之后怎么办?6. 缓存击穿,穿透,雪崩怎么解决?7. MySQL的索引覆盖是什么?以及一个场景题,问会不会发生索引覆盖8. 为什么要遵循最左匹配原则?9. 用什么工具检测IP的连通性?用端口呢?10. TCP为什么发生粘包,怎么解决粘包的问题?11. HTTP的响应吗有哪些,追问了302是什么意思,以及是怎么获取新地址的,401是什么意思?12. HTTP请求头部有哪些?13. HTTPS防范中间人攻击是怎么实现的,如果我伪装服务器呢,怎么判断?14. 什么是虚拟内存?操作系统是怎么实现延迟分配的?15. RPC框架有了解吗?注册中心的作用是什么?数据经过注册中心吗?16. Kafka是如何实现顺序消息的?17. Spring里面哪些注解用于声明Bean?18. 非阻塞I/O相对于阻塞I/O的优势在哪?19. 算法刷过吗?有什么经典百八十题做过没20. 讲讲在操作系统视角,我们常说系统切换,切换的什么东西?为什么切换会有额外的开销?21. cpu有缓存失效问题吗?怎么解决?22. volatile有什么作用?为什么有了MESI还要volatile?23. 既然CPU底层已经有了解决方案(MESI),为什么Java层面还要额外做工作(JMM)呢?24. Java里面的stream流用过吗?map和flatmap有什么区别?25. 怎么判断一个对象可以被回收?GC roots有哪些?26. Java内存模型中happen-before是干嘛的?27. 什么是系统调用?怎么发生系统调用?操作系统是怎么进行状态切换的,用什么机制?数据在这之间传递呢?28. Spring中Bean有哪些作用域?会话是什么意思?29. sleep方法释放锁了吗?
查看29道真题和解析
点赞 评论 收藏
分享
昨天 17:42
酷酷的喜马拉雅山:你为什么发我的offer列表?
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务