【问题标题】:How is rails session shared among unicorn workers?独角兽工人之间如何共享 Rails 会话?
【发布时间】:2015-03-12 08:17:54
【问题描述】:

我使用 unicorn 作为 Rails 服务器,我已经为它配置了 5 个 worker。

我不确定这是否会影响用户会话,所以我做了一个小实验:

puts "------"
puts session[:session_id]
puts "session obj: #{session.hash}"
puts "pid: #{Process.pid}"

这是结果

------
69db720b6620288416ae4ba6f921dfb8
session obj: -4054823339922854099
pid: 4396
------
69db720b6620288416ae4ba6f921dfb8
session obj: 4220002746750993661
pid: 4527
------
69db720b6620288416ae4ba6f921dfb8
session obj: 2637320844486598221
pid: 4396

会话ID始终相同

会话对象每次都不一样

第一个和第三个请求的 pid 相同

所以我假设 Rails 会话内容(不是单例对象,因为每个工作人员都有自己的进程,所以不能这样)在同一主服务器下的不同独角兽工作人员之间共享,但这是否记录在任何地方?

它是由 Rails 框架实现的吗?还是 unicorn_rails 这样做?

【问题讨论】:

    标签: ruby-on-rails ruby session unicorn


    【解决方案1】:

    这部分取决于使用的会话存储。默认是 cookie 存储,其中整个数据被序列化并存储在会话 cookie 中。其他商店只是在会话 cookie 中存储一个 id 并从其他来源(例如 redis)获取数据

    虽然 session 看起来像 Hash 的实例,但它不是 - 它是 Request::Session 的实例,其中包含许多其他内容(例如当前请求的详细信息),因此 session.hash 是正常的每次都不一样。

    您可以使用session.to_hash 将会话转换为实际的哈希,尽管即使那样您可能会发现session.to_hash.hash 在进程之间有所不同,因为哈希值不能保证在各个进程中相同(特别是对于它们的字符串)取决于过程)

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 2015-08-14
      • 2018-06-03
      • 2012-03-27
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 2013-06-15
      • 2012-09-11
      相关资源
      最近更新 更多