【发布时间】:2011-02-13 08:47:15
【问题描述】:
我正在构建一个Facebook app called Lovers,使用Sinatra app on Heroku。它在 Heroku's bamboo-mri-1.9.2 stack 的 Ruby 1.9.2 上运行。
这是一个modular Sinatra app,在Lovers source code 中,我将给每个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 从Lovers 模块中的任何位置访问Facebook::Application 实例,例如从Lovers::User。
这有意义吗,或者我应该让Lovers::Application 的所有实例(如果不止一个)共享同一个Facebook::Application 实例,即Lovers.facebook。这就是我们为 Redis 所做的事情:Lovers.redis,这对我来说很有意义。我想我倾向于将其更改为后者,但我想在更改之前确定。你怎么看?
最后,每个 HTTP 请求是否有一个 Lovers::Application 实例?
更新:
我阅读了Heroku Dynos。显然,每个测功机(进程)运行一个Lovers::Application 的实例。因此,在阅读了sharing a global variable among processes 之后,我认为这意味着如果我在Lovers::Application 类中定义一个类变量@@hit_count,它将具有不同的值,具体取决于哪个测功机接收请求,假设我每增加一次@@hit_count请求主页的时间,即:
@@hit_count = 0
get "/" do
@@hit_count += 1
end
【问题讨论】:
标签: ruby design-patterns facebook sinatra rack