2011-02-07 66 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

相关问题