rails 会话如何在独角兽工人之间共享?

How is rails session shared among unicorn workers?

我正在使用 unicorn 作为 rails 服务器,我已经为它配置了五个 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 始终相同

session对象每次都不一样

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

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

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

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

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

您可以使用 session.to_hash 将会话转换为实际的散列,尽管即使那样您可能会发现 session.to_hash.hash 跨进程不同,因为散列值不能保证跨进程相同(特别是,对于字符串,它们依赖于过程)