Self-hosted Server PUSH

Yoskaldyr

"Спамер"
Партнер клуба
Понадобились уведомления в реальном времени на сайте (в основном мобильные клиенты).
Поэтому вопрос кто что использует для сабжа в связке с пхп (pubsub где пхп - pub, клиенты - sub), насколько это стабильно, какой список поддерживаемых транспортов и как там с прикручиваем сторонней аутентификации (нужна хоть какая-то проверка валидности подписывающегося клиента)?

Нашел этот модуль для nginx-а https://www.nginx.com/resources/wiki/modules/push_stream/
но хз как унего со стабильностью и пока не совсем понятно как делать аутентификацию (разве что через http://nginx.org/ru/docs/http/ngx_http_secure_link_module.html или lua/perl/nginScript )


P.S. Socket.io не предлагать.
 

Yoskaldyr

"Спамер"
Партнер клуба
А почему? Были с ним какие-то проблемы, или просто личная неприязнь?
за все время его существования раз 5 пытался его юзать, но всегда были проблемы - или сервер тек или клиент, или очень нестабильная работа на мобильных клиентах + очень долгий хендшейк.
Обычно нужно готовое решение сервер + клиент, но клиент сокет.ио вообще дибильно работал при большом количестве открытых вкладок (да это браузерная проблема, но клиентский код обязан о ней знать и обходить ее). Понятно что все можно допилить, но по статистике в nodejs сообществе очень редко доводят до ума библиотеки.
Может за последние пару лет что-то и изменилось, но я уже не верю в это.
 

Yoskaldyr

"Спамер"
Партнер клуба
Самое стабильное и безпроблемное для клиента что я видел это lightstreamer, но очень платный, сервер на java, т.е. не допилить. Клиентский код тоже не сильно модифицировать, т.к. запакован, а распакованной версии нет.
Быстрый хендшейк, неограниченное количество открытых вкладок, т.к. в 99% случаев использует только одно перманентное подключение к серверу, работает практически на любом клиенте и на любом типе подключения.
 

Yoskaldyr

"Спамер"
Партнер клуба
И вообще кто и как решает проблему аутентификации подключения к вебсокетам и т.п., сервер которых обычно не на пхп?
 

fixxxer

К.О.
Партнер клуба
очень долгий хендшейк
Это из-за поллинга: по дефолту он стартует с поллинга и пытается проапгрейдиться на вебсокеты. Если клиенты гарантированно умеют в вебсокеты, можно задать transports=['websocket'], и все будет моментально.

кто и как решает проблему аутентификации подключения к вебсокетам
Можно сделать микросервис аутентификации, можно передавать в шифрованном виде или с подписью.
 

Yoskaldyr

"Спамер"
Партнер клуба
@fixxxer, А socket.io версии больше 2.0.0 в продакшене пробовал? Просто смена мажорной версии, а по факту крупное изменение только одно - использование более производительной реализации вебсокетов.
Это из-за поллинга: по дефолту он стартует с поллинга и пытается проапгрейдиться на вебсокеты
Насчет этого понятно, что пока вебсокет установится это задержка, но почему в этот момент нормально лонг-полл не работает.
Если где-то успешно в продакшене работает сокет ио, то какая там нагрузка, сколько одновременных соединений/клиентов и какие данные гоняются по сокетам
 

Yoskaldyr

"Спамер"
Партнер клуба
нашел также это
https://github.com/slact/nchan
скорее всего именно его и буду юзать, т.к. довольно приятное апи и есть возможность дебага/статы.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Аллилуйя! На форуме интересная тема! :)

Понадобились уведомления в реальном времени на сайте (в основном мобильные клиенты).
ты про уведомления клиентам с открытым сайтом, или пуш-уведомления по подписке? по теме второе, по тексту - первое

кто что использует для сабжа в связке с пхп (pubsub где пхп - pub, клиенты - sub), насколько это стабильно, какой список поддерживаемых транспортов
в проде еще не юзал, но игрался вот с такими штуками
https://github.com/ratchetphp/Ratchet
https://github.com/voryx/Thruway
мне понравилось

какие требования к клиентской части и к протоколу?

насколько это стабильно
зависит от того, что ты понимаешь под "этим", потому что "этих" много:
* падения демона на сервере, что не есть проблема, по большому счету
* утечки памяти на сервере, что тоже хрен с ним
* масштабирование, что для постоянных соединений уже интересный вопрос
* исчерпание 64к портов - есть такая проблема с лонг-поллингом, связана с тем, что мобильные операторы во всем мире рубят соединения через промежуток времени без уведомления сервера, клиент открывает новое, а сервер не знает о том, что старое закрыто, и когда клиентов таких >10к - они откушивают все порты за пару часов.
особенно весело в связке с Акамаем или ddos-защитой
* потребление памяти и проца на клиенте, это важно
* совместимость - какие версии клиентов, какие платформы рассматриваем
* региональность: США - можно оставить один вебсокет, леса Амазонки - забить на вебсокет и юзать периодический поллинг, Европа и Россия - веб-сокет с фолбеком на периодический поллинг
* используются ли в проекте веб-воркеры и indexedDb, есть приколы в связке с веб-сокетами

вообще, много подводных камней, что использовать - очень зависит от масштабов проекта

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

Нашел этот модуль для nginx-а https://www.nginx.com/resources/wiki/modules/push_stream/
но хз как унего со стабильностью и пока не совсем понятно как делать аутентификацию (разве что через http://nginx.org/ru/docs/http/ngx_http_secure_link_module.html или lua/perl/nginScript )
со стабильностью будет плохо в любом случае :)
 
Последнее редактирование:

Yoskaldyr

"Спамер"
Партнер клуба
по теме второе, по тексту - первое
Первое :) назвать тему вебсокеты - не совсем то, а раз очень часто называют server push, тот же модуль nginx-а, то решил так назвать (может и не правильно)

зависит от того, что ты понимаешь под "этим", потому что "этих" много:
В том то и дело я в курсе насчет всех этих нюансов (ну почти всех). Почти на все сам наступал, но блин было это пару лет назад и под рунет + в основном десктоп клиенты. А здесь штаты с 80% мобильных клиентов из которых 70% iphone-ы (не только последние, но и самые первые, чаще как раз более старые). Клиенты полный разброс, но очень важна совместимость близкая к 100%, понятно что редко достигаемая учитывая неоднородность клиентов и типов подключения, но желательно максимально возможное покрытие.

вообще, много подводных камней, что использовать - очень зависит от масштабов проекта
Проект по одновременному онлайну небольшой - редко больше 100 одновременно онлайн. Сервер для него мощный (сам может отбить школоло ддос)

падения демона на сервере, что не есть проблема, по большому счету
В принципе да, но тогда клиентский код придется больше пилить. Или есть нормальные связки когда клиент без проблем отрабатывает периодическое пропадание сервера?

* используются ли в проекте веб-воркеры и indexedDb, есть приколы в связке с веб-сокетами
ничего такого не используется - тупо jquery

* утечки памяти на сервере, что тоже хрен с ним
Ну как тек раньше сокет ио - так ему любой памяти мало было, да и когда объем занимаемой памяти переваливал 64гига (или 32 - не помню уже) начинал тупить просто безбожно.

* масштабирование, что для постоянных соединений уже интересный вопрос
Не, это вообще не интересует. Хочется с минимальными усилиями поднять на том же сервере (ну не хайлоад это)

какие требования к клиентской части и к протоколу?
Протокол пофиг, клиентская часть - желательно что независимое или тот же jquery, главное чтобы можно было повесить события на onMessage, onConnect, onDisconnect

* потребление памяти и проца на клиенте, это важно
Желательно поменьше, т.к. куча мобильных клиентов, но все-таки главная задача совместимость

исчерпание 64к портов - есть такая проблема с лонг-поллингом, связана с тем, что мобильные операторы во всем мире рубят соединения через промежуток времени без уведомления сервера, клиент открывает новое, а сервер не знает о том, что старое закрыто, и когда клиентов таких >10к - они откушивают все порты за пару часов.
Ну у многих решений есть лонгполл ттл, так что можно дотюнить если что заранее поставить не сильно большой.

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

со стабильностью будет плохо в любом случае
А что плохо со стабильностью для nginx модулей?
 

Yoskaldyr

"Спамер"
Партнер клуба
А и забыл - очень важна безопасность, т.к. информация конфиденциальная и важно строгое ограничение доступа к подписываемым каналам
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
расписывать тут можно много - может, и распишу, если кому-то интересно

вкратце, мой совет: по дефолту работай по веб-сокету с пинг-понгом и реконнектом, таймаут на проверку установления связи, и если ее нет - регулярный поллинг, но не лонг-полл.
обычно веб-сокеты работают, а у кого не работает - пусть долбят, только без keep-alive.
100 "онлайн" раз в пару секунд - это даже ноутбук потянет, не то что сервер, и никаких проблем с сетью
У тебя главный вопрос по веб-сокетам - по CAP-теореме, а не по выбору софта. Если боишься потери сообщения - делай очередь, это муторно; или не делай - просто иногда теряй сообщения.
Пишется это почти без библиотек за неделю, а вот с продвинутыми библиотеками и лонг-поллом проблемы будут навсегда.

В принципе да, но тогда клиентский код придется больше пилить. Или есть нормальные связки когда клиент без проблем отрабатывает периодическое пропадание сервера?
Нет, сервис надо продублировать и периодически рестартовать. Можно два демона в рамках одного сервера с балансировкой, настраивается не так сложно, зато живет долго.

что плохо со стабильностью для nginx модулей?
это сторонний модуль, стабильность непредсказуемая, и если отвалится - то весь nginx целиком, а если этот же nginx терминирует http - ляжет весь сайт

А остальное - ты или крестик сними, или штаны надень :)
Хочется с минимальными усилиями
решение с возможностью расширения и интеграции
можно дотюнить если что
очень важна совместимость близкая к 100%
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
А и забыл - очень важна безопасность, т.к. информация конфиденциальная и важно строгое ограничение доступа к подписываемым каналам
PCI-DSS или медицина? Варианта два: или свой микросервис авторизации на соседней машине и шифрованные сессии, или подключение к стороннему сервису авторизации.
Запрос для подключения к веб-сокету от клиента с подписью, которую выдало приложение, проверка через тот же микросервис, все стандартно.
 

Yoskaldyr

"Спамер"
Партнер клуба
PCI-DSS или медицина
Да нет, просто персональные данные фигурируют, а клиентам очень не понравится если они всплывут в паблик.

это сторонний модуль, стабильность непредсказуемая, и если отвалится - то весь nginx целиком, а если этот же nginx терминирует http - ляжет весь сайт
можно поднять отдельным сервисом nginx только для данной задачи, а с основного nginx-е проксировать на него.

Одним словом я понял, что за последние пару лет ситуация не поменялась, разве что стало полегче с вебсокетами, а так все равно придется костылить.

В плане поддержки всего что только можно и стабильной работы на любом канале очень хорош Lightstreamer, но не подходит из-за цены и невозможности правки клиентского кода.

В плане простоты интеграции с приложением понравился https://github.com/slact/nchan https://nchan.io/ , т.к. полностью покрывает требования аутентификации соединения, есть шаред соединение, стата и все это без дописывания дополнительного кода, но хз как со стабильностью.

Сокет.ио - хорошее апи и тоже покрывает требования с небольшими добавками кода на ноде, но предыдущий мой опыт был неприятным, правда старая версия :(

Поэтому и хотелось узнать что кто пробовал в продакшене и больше чем 1-2 месяца и что именно. Потому что до того как пустить конфиденциальную инфу можно запустить в тестовом режиме для уведомлений и не критичной инфы.


А насчет лонг полла и мобильных операторов буду иметь ввиду. Из практики через сколько они обычно режут соединение в районе 5-10 сек или больше минуты?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
да кто ж тебе скажет! :)

мой опыт в проде тебе не подходит совсем, писать не буду
 

fixxxer

К.О.
Партнер клуба
А socket.io версии больше 2.0.0 в продакшене пробовал?
Код:
» cat package.json| grep socket
    "socket.io": "^2.0.3",
    "socket.io-redis": "^5.1.0",
Пока не в продакшене, но по нагрузочным тестам вроде норм. Если что нехорошее вылезет - отпишусь через пару месяцев сюда ;)
 
Сверху