Существует ли один экземпляр приложения Rack на HTTP-запрос? - PullRequest
2 голосов
/ 07 февраля 2011

Я создаю приложение Facebook под названием Lovers , использующее приложение Sinatra на Heroku .Он работает на Ruby 1.9.2 в стеке Heroku bamboo-mri-1.9.2 .

Это модульное приложение Sinatra и в источнике Loversкод , я даю каждому экземпляру приложения 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 экземпляр, т. Е. Lovers.facebook.Вот что мы делаем для Redis: Lovers.redis, что имеет смысл для меня.Я полагаю, что склоняюсь к тому, чтобы изменить его на последний, но я хочу убедиться, прежде чем изменить его.Как вы думаете?

Наконец, есть ли один экземпляр Lovers::Application на HTTP-запрос?

ОБНОВЛЕНИЕ:

Я прочитал о Heroku Dynos .По-видимому, каждый dyno (процесс) запускает экземпляр Lovers::Application.Итак, после прочтения о совместного использования глобальной переменной между процессами , я думаю, это означает, что если я определю переменную класса @@hit_count в классе Lovers::Application, она будет иметь разные значения в зависимости от того, какой dyno получитзапрос, при условии, что я увеличиваю @@hit_count каждый раз, когда запрашивается домашняя страница, то есть:

  @@hit_count = 0

  get "/" do
    @@hit_count += 1
  end

1 Ответ

2 голосов
/ 13 февраля 2011

"Наконец, есть ли один экземпляр Lovers :: Application на HTTP-запрос?"

Существует один экземпляр на процесс / dyno.

"он будет иметь разные значения в зависимости от того, какой dyno получит запрос, предполагая, что я увеличиваю @@ hit_count каждый раз, когда запрашивается домашняя страница"

Да, если вам нужно глобальное состояние, вы должны оставить это состояние вне вашего процесса / dyno. Есть много разных способов сделать это, и выбор будет зависеть от деталей вашего приложения и уровня трафика. Если вы не получаете много трафика, вы можете сделать что-то столь же простое, как сохранить его в своей базе данных. Вы можете делать атомарные приращения в postgres или mysql для чего-то вроде hit_count. Однако такой подход может стать узким местом, если у вас много трафика.

...