2015-01-14 43 views
1

我使用獨角獸作爲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始終是相同的

會話對象每次都不同

第一個和第三個rd的請求是一樣的

所以我假設rails會話內容(不是單個對象,這是不可能的,因爲每個worker都有自己的進程)在同一個master下的不同獨角獸工作人員之間共享,但是這在任何地方都有記錄?

並且它是由rails框架實現的嗎?或者是unicorn_rails這樣做?

回答

1

這部分取決於使用的會話存儲。缺省值是整個數據序列化並存儲在會話cookie內的cookie存儲。其他商店只是存儲在會話cookie ID和獲取來自其他來源的數據(例如Redis的)

雖然session貌似Hash一個實例它不是 - 它是Request::Session的實例,它包含了一些其他的事情(如當前請求的詳細信息),因此session.hash每次都是不同的。

雖然即使這樣,您也可能會發現session.to_hash.hash跨進程有所不同,因爲散列值在進程間不保證是相同的(特別是對於字符串,它們是進程相關的)