我使用独角兽作为rails服务器,我为它配置了五名工作人员。
我不确定这是否会影响用户会话,所以我做了一个小实验:
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会话内容(不是单例对象,因为每个工作者都有自己的进程,因此不能在同一个master下的不同unicorn worker之间共享),但这是在任何地方记录的吗?
是否由rails框架实现?还是unicorn_rails这样做?
答案 0 :(得分:1)
这部分取决于所使用的会话存储。默认值是cookie存储,其中整个数据被序列化并存储在会话cookie中。其他商店只在会话cookie中存储一个id并从其他来源获取数据(例如redis)
虽然session
看起来像Hash
的实例但它不是 - 它是Request::Session
的一个实例,其中包含许多其他内容(例如当前请求的详细信息)所以它是session.hash
的正常值每次都不同。
您可以将会话转换为session.to_hash
的实际哈希值,尽管如此,您可能会发现session.to_hash.hash
因进程而异,因为不确保哈希值在各个进程中相同(特别是,对于字符串,它们依赖于流程)