Как стать автором
Обновить

WebSockets в Rails приложении

Время на прочтение3 мин
Количество просмотров17K
Недавно я столкнулся с необходимостью реализовать небольшой чат в одном из Rails-проектов. Существует много способов решения данной задачи, начиная от периодических опросов сервера с помощью AJAX и заканчивая использованием готовых решений сторонних сервисов. С целью минимизации трафика и времени отклика системы было принято решение использовать WebSocket API – одну из частей стандарта HTML 5, позволяющую серверу инициировать передачу данных, не дожидаясь запроса клиента. К сожалению WebSocket API поддерживается достаточно ограниченным числом браузеров, среди которых Google Chrome, Safari 5, Mobile Safari в iOS 4.2 и выше и пожалуй все (если я ошибаюсь – поправьте меня в комментариях). Конечно же этого недостаточно для боевого приложения, поэтому необходимо предложить запасной вариант для браузеров без нативной поддержки WebSocket API. Удобнее всего в этом случае использовать Flash Sockets. С помощью WebSocket API и Flash Sockets приложение покрывает большую часть возможных случаев, включая как настольные системы (MS Windows, Linux, Mac OS X), так и мобильные (Android, iOS).

Перейдем от теории к практике, поговорим о том, какие средства позволяют использовать WebSocket API в Rails-приложении. Существует несколько возможных вариантов, среди которых отмечу следующие:
  • Juggernaut (http://juggernaut.rubyforge.org/) — решение, изначально написанное на Ruby, а потом переписанное на node.js. Для хранения данных используется Redis, имеется gem для тесной интеграции с Rails-приложением. Juggernaut предлагает достаточно большое количество способов реализации и эмуляции WebSocket API, к примеру, если в браузере недоступны ни нативная поддержка WebSockets, ни возможность загрузки Flash-объекта, то необходимый функционал эмулируется с помощью периодических AJAX запросов, что конечно увеличивает время отклика системы и повышает нагрузку на сервер, но, как говорится, на безрыбье и рак рыба. Минусами Juggernaut в моей ситуации были: необходимость установки redis и node.js на сервер, с чем я еще мог смириться, но вот баг из-за которого в FF не работал Flash fallback стал просто последней каплей, после которой я пошел искать альтернативы Juggernaut.
  • pusher.com – сервис, берущий на себя все заботы по работе с WebSockets API и позволяющий отправлять сообщения клиентам с помощью REST интерфейса. Сильными сторонами pusher.com являются масштабируемость и возможность анализа взаимодействия пользователей с интернет-ресурсом. К сожалению в моем случае использование внешнего сервиса было затруднено, поэтому от pusher.com пришлось отказаться.
  • Socky-server (https://github.com/socky/socky-server-ruby) – сервер написанный на Ruby на основе EM-WebSocket и EM-HTTP-Client, который поддерживает WebSockets API и Flash fallback. Для интеграции с Rails используется gem socky-client-rails. Имеется поддержка комнат, авторизации и отправки сообщения конкретному пользователю. Что мне действительно понравилось в этом решении (особенно после Juggernaut), так это работа всего из коробки: прописываем пару зависимостей в Gemfile, выполняем bundle install, генерируем конфиг, запускаем сервер и можно приступать к разработке. Пример простого чата с использованием socky-server можно увидеть тут: sockydemo.imanel.org а исходный код посмотреть тут: http://github.com/socky/socky-example.


Подводя итог, отмечу, что использование WebSockets API позволяет повысить интерактивность веб-приложения, и сделать ресурс более удобным, при этом несильно нагружая сервера, а Socky-server сделает работу с WebSockets API в Rails-приложении простым и безболезненным занятием.
Теги:
Хабы:
Всего голосов 9: ↑7 и ↓2+5
Комментарии11

Публикации

Истории

Работа

Ruby on Rails
12 вакансий

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн