AJAX и Rails: два стека или один?

Большая часть веб-приложения представляет собой довольно стандартный CRUD. Мне нужно, чтобы некоторые данные передавались клиентам в режиме реального времени по мере их создания. Стоит ли запускать отдельный, более легкий стек (например, Sinatra или EventMachine) для AJAX?

Если я запущу один стек, у меня будут накладные расходы Rails. Для этого может потребоваться больше процессов/серверов Rails, так как же мне общаться между ними без запросов к базе данных? ZeroMQ? Наконец, подходит ли Rails для обработки сотен одновременных подключений?

Если я запущу два стека, мне нужно будет дублировать логику авторизации.

Какие методы оказались успешными для вас?


person Eli    schedule 01.11.2010    source источник
comment
Здесь есть несколько вопросов. Возможно, вам стоит высказать свою озабоченность. У вас возникли проблемы с масштабированием или вы ожидаете, что с этим возникнут проблемы? Очевидно, что некоторые из них масштабируют приложения Rails, но, как и в случае с любой другой технологией, вы должны проявить смекалку, чтобы все работало правильно.   -  person Steve Ross    schedule 01.11.2010


Ответы (1)


В Rails 3 вы можете довольно легко подключиться к Rack-приложениям, используя новый синтаксис маршрутизации и наследуя свои контроллеры от ActionController::Metal или просто определяя self.call.

прочитайте (или посмотрите) Railscast #222 и посмотрите < href="http://yehudakatz.com/2009/12/20/generic-actions-in-rails-3/" rel="nofollow">блог wycats (примеры выдержек см. ниже).

Вы уже знаете о дополнительных случаях, которые вам нужно будет обработать, если вы пойдете по этому пути, поэтому убедитесь, что это необходимо, прежде чем застрять в нем. Обычно дешевле сбросить $ на серверы, чем на программистов - железо и пропускная способность довольно дешевы.

Я лично считаю, что это подпадает под «преждевременную оптимизацию», если только ваше приложение уже не запущено и не поглощает слишком много трафика.


Несколько хороших примеров:

# config/routes.rb
# Hook in Sinatra
root :to => HomeApp
# Write your own barebones Rack compatible code
match "/processes" => ProcessesApp
# Even specify an inline proc
match "/heartbeat", :to => proc {|env| [200, {}, ["App is running"]] }

# /lib/home_app.rb
class HomeApp < Sinatra::Base  
  get "/" do  
    "Hello from Sinatra"  
  end  
end  

# lib/processes_app.rb
class ProcessesApp  
  def self.call(env)  
    [200, {}, [`ps -axcr -o "pid,pcpu, pmem, time, comm"`]]  
  end  
end  
person nfm    schedule 01.11.2010