上午到了北3环一家公司面试,其他细节略过......其中面试官提了一个问题却让我陷入了沉思.......直接看面试题(大牛可以忽略)......
面试官:“请问按用户的多次提交,这个问题怎么解决?”
我不假思索说道:”这个问题也遇到过,属于表单重复提交问题吧?“
面试官:”嗯,是的。“
我继续道:”解决方案一般如下“
- 前端:在用户点击完成后,使用js改变提交按钮状态,设置为无效状态......
- 后端:采用重定向的方式跳转到目标页面......
- 使用一个token机制......
没等说完,面试官打断了我的回答,前端JS处理是一种解决方案,但session是不能解决问题的,如果是绕过JS呢?这种多次点击可能会造成添加了多条记录,甚至库存超卖的问题。
我记忆中一般就这几种解决方案,继续道:“没太明白你的意思”,面试官拿着简历看了看我继续道:”平时工作中没遇到这种情况吗?多次提交或者有大量的并发请求,导致重复插入记录、库存超卖问题.......“
终于明白面试官想问什么了,其实他问的是两个问题。我继续道:”如果是高并发导致的库存超卖问题,单体架构的系统可以使用线程同步加锁机制来解决,如果是分布式系统可能需要用到redis分布式锁、基于数据库SQL、基于zookeeper......的解决方案“。
面试官终于欣慰的说道:”lock一下是吧“然后又低头看着简历进入了下一个话题,我也就没在多说什么.......
放下高并发这个概念先不谈,其实面试官问的是两个问题,而且不应该把这两个问题搞混。回到家后我觉得有必要把这两个问题重温、分别梳理一下.........其实网上的资料很多,但很多是直接拿来主义,说的不是很明白。而且针对不同场景有不同的解决方法,以下为我认为讲的比较清楚的文章,大家可以直接去看:
- 防止表单重复提交解决方案:https://www.xz577.com/j/46629.html
- 高并发下库存超卖类问题解决方案(线程同步、分布式锁):
- https://mp.weixin.qq.com/s/Nsw27TIqNXfXgfDNTevkHg
- https://mp.weixin.qq.com/s/XqW0dETggPa4Tgv7SMXR4g
如果有其他不同场景下不同解决方案的朋友欢迎留言并讨论。大牛有好的文章也欢迎放出来哈......