Лучший способ запустить рельсы с длительными задержками - PullRequest
2 голосов
/ 30 декабря 2010

Я пишу веб-сервис Rails, который взаимодействует с различным оборудованием, разбросанным по всей стране.

Когда выполняется вызов веб-службы, приложение Rails затем пытается связаться с соответствующим компонентом оборудования, получить необходимую информацию и ответить веб-клиенту. Время между звонком клиента и ответом может составлять до 10 секунд, в зависимости от множества факторов.

Я не хочу разделять вызов веб-службы на две части (запросить информацию, немедленно ответить ожидающим ответом, а затем принудительно вызвать другой вызов API для получения фактических результатов).

Я в основном вижу два варианта. Либо запустить JRuby и использовать многопоточность, либо запустить несколько обычных экземпляров Ruby и надеяться, что не многие люди будут пытаться использовать службу одновременно. JRuby кажется намного лучшим решением, но оно все еще не является общепринятым и имеет встроенную поддержку в Heroku и EngineYard. Решение для нескольких экземпляров выглядит как полный кладж.

1) Я прав насчет двух моих вариантов? Есть ли лучший, по которому я скучаю? 2) Есть ли простой вариант развертывания для JRuby?

Ответы [ 3 ]

2 голосов
/ 31 декабря 2010

Я не хочу разделять вызов веб-службы на две части (запросить информацию, немедленно ответить ожидающим ответом, а затем принудительно вызвать другой вызов API, чтобы получить фактические результаты).

С инженерной точки зрения кажется, что это будет лучшая альтернатива.

Почему ты не хочешь это сделать?

1 голос
/ 30 декабря 2010

Существует третий вариант: если вы размещаете приложение Rails с Passenger и включаете глобальные очереди , вы можете сделать это прозрачно.У меня есть некоторые действия, которые занимают несколько минут, без каких-либо проблем (предостережение: некоторые браузеры могут прерваться, но это может вас не беспокоить).

Если вас беспокоит тайм-аут браузера, или вы не можетеУправляя средой развертывания, вы можете обрабатывать ее в фоновом режиме:

  1. Пользователь запрашивает данные
  2. Вы вводите запрос в очередь
  3. Ваша веб-служба возвращаетидентификатор «тикета» для проверки хода выполнения
  4. Фоновый процесс обрабатывает задания в очереди
  5. Пользователь запрашивает ответ, ссылаясь на идентификатор «тикета»

AsЧто касается хостинга в JRuby, я развернул пару небольших внутренних приложений, используя glassfish gem , но я не уверен, насколько сильно я бы доверял этому для ориентированных на клиента приложений.Просто убедитесь, что вы запускаете config.threadsafe! в production.rb.Я слышал хорошие новости и о Тринидаде .

0 голосов
/ 30 декабря 2010

Вы также можете запустить вызов веб-службы в отложенном фоновом задании, чтобы он не загружал веб-сервер и даже мог запускаться в отдельном физическом блоке. Это также гораздо более масштабный подход. Если вы совершаете веб-вызов с использованием AJAX, вы можете пинговать сервер каждую секунду или две, чтобы проверить, готовы ли ваши результаты. Таким образом, ваш клиент не будет находиться в подвешенном состоянии, пока результаты вычисляются, а время запроса не истекает.

...