招联一面

项目里有一个类似秒杀的功能,面试官问我怎么考虑记录插进数据库失败,这该怎么考虑啊
全部评论
(秒杀问题中的一个方向,不一定是面试官真问的) 订单系统 和 商品库存系统 可能不在一个数据库或一个服务器上,不能用数据库事务完成,你必须自己保证两个系统的一致性,也就是要么订单创建成功、库存扣减也成功,要么两者都失败。如果库存扣完了,但订单创建失败,那你要保证库存加回来、且订单一定不会创建成功(至少之后要删掉它)(因为要及时响应用户,一直等订单服务响应是不可能的)。这个是典型的分布式事务问题。 难点在于,如果请求订单服务超时(不是直接返回插入失败),服务器短时间没法知道请求是失败了(订单不会创建成功),还是请求没有失败、只是被延迟了(订单之后又成功更新了)。 最简单的方法应该是,服务器重试几次、允许等一小段时间,如果还是超时或请求失败,就直接返回下单失败,撤销库存更新;然后开一个定时任务定期给订单服务发补偿信息(删除订单或标记订单无效,如果是库存服务超时就是加库存)直到这个消息被成功处理。 服务器的插入请求和补偿请求必须满足幂等性:重发插入请求不会导致一个订单被插入多次;重复发补偿不会导致订单被删多次(对库存服务就是库存被加多次)。并且要注意在订单真的创建后,才执行这个补偿。
4 回复 分享
发布于 2023-05-16 20:01 上海
意思是,先在缓存扣库存,之后扣减数据库库存失败么?
点赞 回复 分享
发布于 2023-05-14 15:42 北京
楼主投的什么岗啊
点赞 回复 分享
发布于 2023-05-13 18:39 湖北
m
点赞 回复 分享
发布于 2023-05-13 17:28 湖南

相关推荐

Twilight_mu:经典我朋友XXXX起手,这是那种经典的不知道目前行情搁那儿胡编乱造瞎指导的中年人,不用理这种**
点赞 评论 收藏
分享
评论
1
21
分享

创作者周榜

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