我正在构建一个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。但是,如果您有大量的流量,这种方法可能会成为瓶颈。

07-24 09:29