最近的工作是一个库存管理系统,后端为 rails,前端为 angular web app,但是遇到问题就是两个管理员可能同时在操作同一个商品,一头在操作时,另一头可能已经卖掉了。如何在不把这个界面全面变成一个实时的 web app 的前提下,尽可能的实现状态的通知或者减少操作冲突?
后端虽然能够保证一个商品不会真正被卖掉两次,但操作起来冲突情况太多体验也很差。
做成真正实时不仅需要较多工作量,而且在这个案例可能也没有必要。
我觉得 Long polling by Javascript 应该是比较合适的方案。
Long polling 很简单,就是用 setInterval 来不断地请求服务器。
setInterval(callServerOnStock(), 1000);
后台有更新就回一个信息,比如某商品已经被卖掉。然后前端根据这个信息把那个商品描黑。虽然不能 100% 避免冲突,但应该足够了,而且后台还是有另一层保护的。
你可以只在这个页面或 View 中设置 long polling。
Long polling 的最大弊端就是服务器负荷大,因为请求多。但在你的情况中应该完全不成问题,毕竟管理系统只有很少人在同时使用的,而且只在特定的页面。
操作前先检测下状态吧
乐观锁
#1 楼 @billy 这个确实可以接受,管理员数量不会太多
加状态
听起来就是状态机能解决的问题。只要规定状态转移的条件就行了。