与redis会话的竞争条件

时间:2016-02-25 10:04:07

标签: ruby session race-condition

我遇到的问题是我的软件会在会话中存储关键数据。

由于我使用ajax并且用户只需在几个选项卡中打开软件,就会有并行请求。 不幸的是,一次将其限制为一个请求是不可能的。

我最初尝试解决此问题的方法是在application_controller中使用after_filter来调用一个方法来检测其他工作人员所做的更改,并在保存之前将它们合并到自己的会话对象中。

不幸的是,这确实缓解了我的问题,但没有彻底解决。 在我看来,在我的after_filter和实际保存我的会话的中间件之间,即ActionDispatch :: Session :: RedisStore,仍然存在足够大的差距,让另一个工作者编写自己的会话。

我想不出任何其他解决这个差距的解决方案,但是这个:

  1. 编写一个继承自中间件
  2. 的类
  3. 教它执行"合并代码"在get_session和set_session中
  4. 用config.middleware.swap
  5. 替换原来的中间件

    在我这样做之前,我想征求意见和建议,或者理想情况下,更好的解决方案。如果不先征求意见,那么弄乱中间件对我来说似乎太危险了。

1 个答案:

答案 0 :(得分:0)

由于您说会话中的数据很关键,我认为最好同步来自每个用户的请求,同时保持不同用户之间的并发。

例如,您可以启动多个rails进程,每个进程都监听自己的端口,并在这些进程之上提供负载均衡器(例如Nginx)。 具有会话粘性功能的负载均衡器是完美的,但IP哈希也是可以接受的。