Я пытаюсь разобраться с асинхронным шаблоном, связанным с запуском eventmachine на Heroku с Синатрой. В двух словах, я пытаюсь добиться следующего: с помощью em-http создать http-запрос к API потоковой передачи Twitter, с помощью stream callback, проанализировать и отправить твит. клиентам, использующим веб-сокеты. Все идет нормально. Проблема возникает, когда одно и то же приложение также должно обслуживать веб-страницы. В моем config.ru у меня есть, помимо прочего, вещи из Bundler
require 'app'
run TwitterApp
Тогда в моем файле приложения блок EM:
EM.run{
class TwitterApp < Sinatra::Base {
get '/' do
haml :index
end
}
http = EventMachine::HttpRequest.new(url, options).get :head=>{'Authorization' => [USERNAME, PASSWORD]}
http.stream do |chunk|
#parse tweet, push using websockets
end
}
Теперь, похоже, происходит то, что запускает TwitterApp никогда не достигается, потому что EventMachine использует шаблон Reactor и никогда не возвращается.
Альтернативно, если я попытаюсь сделать
App.run!
в блоке EM.run все нормально работает локально и работает с использованием ruby app.rb , но с использованием rackup кажется, что сервер запускается дважды (один раз с thin и другой с WEBrick) и на Heroku вылетает с
Error R11 (Bad bind) -> Process bound to port other than $PORT
Stopping process with SIGKILL
Я что-то упускаю здесь очень тривиально?
Большое спасибо!