我建立一個Facebook app called Lovers,使用Sinatra app on Heroku。它在Heroku's bamboo-mri-1.9.2 stack上運行在Ruby 1.9.2上。每個HTTP請求是否有一個Rack應用程序實例?
這是一個modular Sinatra app,而在Lovers source code,我給西納特拉的應用程序的每個實例(Lovers::Application
)的Facebook::Application
一個實例:
require 'sinatra/base'
class Lovers::Application < Sinatra::Base
attr_reader :facebook
def initialize(app=nil)
@facebook = Facebook::Application.new(
Lovers::Conf.fb_app_id,
Lovers::Conf.fb_app_secret,
Lovers::Conf.fb_canvas_name)
super(app)
end
# ...
end
這樣一來,你可以做Lovers.application.facebook
訪問Facebook::Application
實例從Lovers
模塊中的任何地方,例如從Lovers::User
。
這是否有意義,或者我應該只有Lovers::Application
(如果有多個)共享相同的Facebook::Application
實例,即Lovers.facebook
的所有實例。這就是我們爲Redis所做的:Lovers.redis
,這對我很有意義。我想我傾向於將它改變爲後者,但我想確保在我改變它之前。你怎麼看?
最後,有沒有的Lovers::Application
每個HTTP請求的一個實例?
UPDATE:
我對Heroku Dynos讀了。顯然,每個dyno(進程)運行一個Lovers::Application
的實例。所以,閱讀sharing a global variable among processes後,我認爲這意味着,如果我定義的Lovers::Application
類的類變量@@hit_count
,它會根據其測功機接收請求,假設我增加每次請求主頁時@@hit_count
,即不同的值:
@@hit_count = 0
get "/" do
@@hit_count += 1
end
你能否詳細說明了一些可能的想法,飼養過程外的狀態?我試圖想出一個很好的解決方案,避免將數據存儲在數據庫中 - 這是在高流量環境下不會掉下來的問題。謝謝 – 2012-02-23 21:47:13