2011-02-07 61 views
2

我建立一個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 

回答

2

「最後,是否有一個Lovers :: Application每個HTTP請求的實例?」

有每個進程/ DYNO一個實例。

「這將有充分的主頁被請求的時間,這取決於賽道接收請求,假設我增加@@ hit_count不同的價值觀」

是的,如果你需要的全局狀態,你必須保持狀態外你的過程/動態。有很多不同的方法可以做到這一點,您選擇的方式取決於您的應用程序的細節和流量級別。如果你沒有得到很多流量,你可以做一些簡單的事情,比如把它放在你的數據庫中。你可以在postgres或mysql中做類似hit_count的原子增量。但是,如果您擁有大量流量,則此方法可能會成爲瓶頸。

+0

你能否詳細說明了一些可能的想法,飼養過程外的狀態?我試圖想出一個很好的解決方案,避免將數據存儲在數據庫中 - 這是在高流量環境下不會掉下來的問題。謝謝 – 2012-02-23 21:47:13

相關問題