我正在构建一个Facebook app called Lovers,使用一个Sinatra app on Heroku它运行在Ruby 1.9.2上。
这是一个Heroku's bamboo-mri-1.9.2 stack,在modular Sinatra app中,我给Sinatra应用程序的每个实例(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
。这就是我们为Redis所做的:Lovers.facebook
,这对我来说很有意义我想我倾向于把它改成后者,但我想在改之前先确定一下。你怎么认为?最后,每个http请求是否有一个
Lovers.redis
实例?更新:
我读到了Lovers source code。显然,每个dyno(进程)都运行一个
Lovers::Application
实例。因此,在阅读了关于Heroku Dynos的内容之后,我认为这意味着如果我在Lovers::Application
类中定义了一个类变量@@hit_count
,那么它将具有不同的值,这取决于dyno接收请求的类型,假设每次请求主页时我都会增加Lovers::Application
,即: @@hit_count = 0
get "/" do
@@hit_count += 1
end
最佳答案
“最后,每个http请求是否有一个lovers::application实例?”
每个进程/dyno有一个实例。
根据dyno接收请求的类型,它将有不同的值,假设每次请求主页时我都增加@@hit\u count
是的,如果您需要全局状态,则必须将该状态保留在进程/dyno之外。有很多不同的方法可以做到这一点,你选择哪种方法取决于你的应用程序的详细信息和你的流量水平。如果你没有得到大量的流量,你可以做一些简单的事情,如保持它在你的数据库。您可以在postgres或mysql中执行原子增量,例如hit_count。但是,如果您有大量的流量,这种方法可能会成为瓶颈。