Разрабатывая реалтаймовый сервис можно обойтись привычным setInterval(), но стоит воспользоваться возможностями технологии WebSocket и ей подобным. Вот какие преимущества вы получите:
- Мгновенное уведомление клиента о событии
- Возможность создать сервис, использующий каналы событий благодаря pub/sub архитектуре.
- Отсутствие постоянного поступление запросов на сервер и снижение нагрузки как следствие.
Наш проект разработан на Ruby on Rails и использует связку Nginx + Passenger.
Из всех библиотек реализующих обмен сообщениями, наиболее безболезненно внедряется Faye.
- Работает как отдельных процесс и не требует использования какого-либо определённого сервера.
- Не зависит от конфигурации проекта
- Имеются версии для RoR и Node.js
Процесс настройки и использования подробно описан в документации, статье на хабре Faye как способ не задолбать свой сервер и в скринкасте Faye.
Но как это обычно бывает, трудности могут возникнуть в любой момент, стоит сделать шаг в сторону.
Сейчас я хотел бы описать ситуацию настройки Faye при использовании SSL.
Пусть эта небольшая статья сохранит кому-то несколько часов жизни.
Настройка сервера Faye
Faye использует в роли сервера Thin. Запускаем его со включенным SSL.
Создаем в корне проекта файл faye.ru со следующим содержимым
require 'faye' faye_server = Faye::RackAdapter.new(:mount => '/faye', :timeout => 30) Faye::WebSocket.load_adapter('thin') run faye_server
В директории проекта lib/ssl/ размещаем SSL сертификаты.
Создаем файл конфигурации config/thin.yml
— port: 9292
ssl: true
ssl_key_file: /<Имя проекта>/lib/ssl/cert.key
ssl_cert_file: /<Имя проекта>/lib/ssl/cert.crt
environment: production
rackup: faye.ru
Для запуска сервера используем команду:
bundle exec thin -c config/thin.yml -e production start
(production режим обязателен)
Сервер настроен и запущен, пришло время помочь faye клиенту соединиться.
Настройка клиента Faye
Клиент будет соединяться по адресу
https://example.com/faye
Используем Nginx для создания прокси к серверу Faye.
В блоке сервера описываем следующий location.
location /faye { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass https://127.0.0.1:9292; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; break; }
Перезапускаем Nginx и если все правильно настроено, мы может установить соединение клиента с сервером и подписаться на канал.
var faye = new Faye.Client("https://example.com/faye"); faye.subscribe("/events", function(data) { alert(data) });
Отправка сообщений из Rails
Для отправки необходимо сделать запрос на Faye сервер с указанием канала и сообщения. При использовании SSL, для этого используется следующий метод:
/* channel канал сообщений data данные в json формате */ def broadcast(channel, data) url = URI.parse("https://localhost:9292/faye") form = Net::HTTP::Post.new(url.path.empty? ? '/' : url.path) form.set_form_data(:message => {:channel => channel, :data => data }.to_json) http = Net::HTTP.new(url.host, url.port) http.use_ssl = url.scheme == "https" http.verify_mode = OpenSSL::SSL::VERIFY_NONE http.start {|h| h.request(form)} end
В итоге мы имеем полностью настроенную и работающую систему обмена сообщениями с клиентом.
В проекте Staply эта технология используется по прямому назначению, для обмена сообщениями между пользователями.
Я не описал немаловажную тему безопасности, но это уже совсем другая история.
Спасибо за внимание.
ссылка на оригинал статьи http://habrahabr.ru/company/staply/blog/232745/
Добавить комментарий