Работаете с EventMachine Worker на Heroku + Sinatra + Twitter Streaming API? - PullRequest
2 голосов
/ 20 мая 2011

Я пытаюсь разобраться с асинхронным шаблоном, связанным с запуском 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

Я что-то упускаю здесь очень тривиально?

Большое спасибо!

Ответы [ 4 ]

3 голосов
/ 08 сентября 2011

Для этого вы можете просто запустить async_sinatra - https://github.com/raggi/async_sinatra - и использовать его асинхронные обработчики, а не запускать свои собственные.

2 голосов
/ 12 августа 2011

Я запускаю реактор в его собственном потоке, чтобы он не блокировал основной процесс:

  if not EM.reactor_running?
    Thread.new {
      EM.run {
        logger.info "Starting EventMachine Reactor"
        EM.error_handler{ |e|
          logger.error "Error raised during event loop: #{e.message}"
          logger.error e.backtrace unless e.backtrace.nil?
        }
      }
    }
  else
    logger.info "Reactor already started"
  end

Затем я запускаю вещи через

 EM.next_tick { do_background_stuff }

Я все еще жду, чтобы узнать, что вам нужен Worker Dyno, чтобы использовать этот шаблон.

1 голос
/ 22 января 2012

Я не очень знаком с Eventmachine, но, насколько я понимаю, Websockets еще не поддерживается в Heroku.Такие проекты, как travis-ci, позволяют обойти это, используя сервис типа Pusher для обслуживания своих веб-сокетов.

Ошибка R11 (плохое связывание) в Heroku означает, что вы должны убедиться, что ваш веб-работник связывается с портомчто он получает от Heroku (ENV["PORT"]).Это гарантирует, что HTTP-маршрутизация поддерживается.

Надеюсь, это поможет в некотором роде.

0 голосов
/ 30 мая 2011

Вы можете разделить ваше приложение на несколько экземпляров сервера. Приложение 1 обслуживает веб-страницы, а приложение 2 запускает сервер событий (оба подключены к одной базе данных). Вы можете использовать Pusher , чтобы склеить все вместе с сетевыми розетками.

Не могли бы вы вставить суть полного приложения Sinatra?

...