2010-07-07 2 views
1

Мне нужно отправить оповещения в веб-систему мониторинга, написанную в RoR. Решение грубой силы - это часто опробовать легкий контроллер с javascript. Естественно, недостатком является то, что для того, чтобы получить время отклика на оповещения, мне пришлось бы опросить очень часто (каждые 5 секунд).Быстрые ответы AJAX от приложения Rails

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

Одна вещь, на которую я не рассчитывал, заключалась в том, что mongrel/rails не запускает нить на веб-запрос, как я и ожидал. Это означает, что другие входящие веб-запросы блокируются до тех пор, пока не истечет время ожидания первого потока.

Я пробовал возиться с вызовом «config.threadsafe!» в моей конфигурации, но это, похоже, не изменяет поведение на поток для каждой модели запроса. Кроме того, похоже, что работает с config.threadsafe! является рискованным предложением, которое может потребовать гораздо большего тестирования и переделки на мое существующее приложение.

Любые мысли о подходе, который я использовал, или о лучших способах получения времени ответа, которое я ищу, без необходимости потопить сервер с запросами?

ответ

1

Вы можете использовать Rails Metal для улучшения производительности контроллера или, возможно, даже полностью изолировать его от приложения Sinatra (Sinatra может обрабатывать некоторую серьезную пропускную способность запроса).

Другая идея состоит в том, чтобы изучить push-решение, используя Juggernaut или аналогичный.

+0

Речь идет не о производительности контроллера. Моя проблема действительно преднамеренно задерживает некоторые ответы сервера, в то время как запрос AJAX ожидает предупреждения, позволяя другим продолжать. – Chris

+0

Я просто оглядывался назад по старым вопросам и думал, что я отдам должное этому. Джаггернаут - хорошее решение COMET на орбите. Я решил проблему с однопоточным подключением к mungrel, переключившись на Phusion Passenger. С каким легким сервисом можно заниматься! – Chris

0

Один из подходов, который вы могли бы рассмотреть, состоит в том, чтобы иметь (некоторые или все) ваши запросы создавать отложенные задания мониторинга в external queue, которые, в свою очередь, периодически уведомляют приложение мониторинга.

+0

Я видел ссылки на плагины очередей, но решил, что как только вы ставите в очередь запрос на его обработку, вы все равно сразу получите ответ клиенту. Я хочу приостановить отправку ответа клиенту, пока сервер ждет оповещений. Может быть, я ошибаюсь в плагинах очередей? – Chris

0

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

+0

Juggernaut действительно выглядит как разумное решение. Однако мне не нравится открывать новый порт в брандмауэре для флеш-памяти. – Chris

Смежные вопросы