Возможен ли длинный опрос с приложением Rails, использующим EventMachine? - PullRequest
5 голосов
/ 22 ноября 2011

Я пишу простое приложение для чата в Rails 3.1 - для учебных целей. Для начала у меня есть все необходимые модели (сообщения, пользователи, комнаты и т. Д.), И все отлично работает. Клиенты опрашивают сервер каждую минуту (например) и получают новые сообщения, если они есть.

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

Я много читал о EventMachine и изменил свое приложение rails на пользовательское, так как я хотел использовать EventMachine для механики, управляемой событиями. Я думал, что канал EventMachine пригодится для этого. Клиент подключится и будет ждать сообщения в чате, и он получит сообщение только тогда, когда оно было отправлено в комнату.

Что я не могу понять, так это как я могу использовать экземпляр EventMachine :: Channel для всех моих клиентских подключений. Возможен ли такой подход или я ошибаюсь?

Если возможно, я бы хотел, чтобы решение работало как отдельное приложение rails, размещенное на Heroku.

Ответы [ 3 ]

1 голос
/ 11 ноября 2012

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

  1. Клиент устанавливает соединение, сообщая свою собственную координату (генерируется случайным образом)

  2. Существует массив, сохраняющий все координаты для каждого клиента

  3. Когда клиент перемещается, он отправляет свою новую координату на сервер. Затем сервер узнает людей рядом с ним (из массива) и передает новые координаты этим клиентам.

Я проверил это с почти 5000 клиентами, и каждую секунду 20-30 игроков перемещают свою позицию. Процесс сервера занимает менее 100М памяти и использует 50–60% ЦП (на одно ядро).

В вашем случае, я думаю, вам, вероятно, стоит попробовать и Фэй. Он основан на машине событий и подходящем решении таких вещей, как чат.

0 голосов
/ 26 сентября 2012

В Rails будет добавлена ​​потоковая передача в версии 4. На данный момент вы можете выполнять потоковую передачу (длинный опрос), как в этом примере с Sinatra и функцией Redis Pub / Sub в качестве внутреннего интерфейса.Вам нужно будет добавить еще одно действие для обработки отправленных пользователем сообщений, добавив их в Redis с помощью команды PUBLISH.Вы должны использовать сервер Evented, например, Thin или Puma.

0 голосов
/ 22 ноября 2011

Расширяя то, что я упомянул в комментарии, проверьте этот пост blog , в котором объясняется, как создать текстовое приложение для чата с использованием EM, и используется AMQP для передачи сообщений другим пользователям.

Я думаю, что вы, вероятно, можете сделать то же самое или использовать некоторые из них в очередях памяти для обмена сообщениями, и это определенно должно работать на heroku, поскольку у вас нет зависимости от внешнего сервиса, такого как RabbitMQ.Вот хорошее обсуждение различных каркасов очередей: ActiveMQ или RabbitMQ или ZeroMQ или

...