@xenon
Клиент — собственное приложение, на python, крутится на linux (десктоп).
Как организовать это оповещение? Хочется решение и простое и безопасное и легкое для сервера.
Наверное, подошел бы RabbitMQ или другой message broker, но не хочется пускать в rabbitmq много не доверенных клиентов. (Безопасно ли это?)
Сейчас рабочая версия — сделать websocket сервер и через него оповещать. Но это тоже не очень нравится:
1. Все равно будут сотни коннектов (даже пустых), это, может быть нагрузкой на сервер
2. Как поведут себя коннекты если по нему сутки не будет ничего пролетать?
3. Есть ощущение, что это будет какой-то «велосипед», повторение уже созданной задачи.
Есть ли готовый сервер для таких задач (задача-то типовая, как мне кажется)?
Может быть есть даже сервис, чтобы на своем железе ничего не крутить, а мое серверное приложение само будет клиентом для сервиса, отсылать оповещение в сервис, откуда уже его будут получать клиенты?
Решения вопроса 0
Ответы на вопрос 1
@vistoyn
То что ты говоришь, называется web push уведомлениями.
Почитай алгоритм как они работают, и сделай также.
Вроде как есть https://gotify.net/ и клиент под него
Проблема с вебсокетами в том, что на каждого подключённого клиента, на сервере будет выделяться память. И если много клиентов одновременно будут держать открытые соединения, то может память сервера кончится, и надо будет масштабировать сервер.
Как вариант можно юзать UDP протокол. Там не тратится память. Но надо будет решить проблему с NAT. NAT на клиенте можно обойти через проброс портов на роутере. Есть даже автоматический проброс портов через UPnP. Но это не везде будет работать. Где не работает, там вебсокеты.
Как идея второй вариант:
Если обновления происходят раз в час, или раз в неделю, и задержка в 5-10 минут не критична, то можно следующее решение. Клиент по таймауту раз в несколько минут отправляет post запрос (чтобы не кэшировался), где будет возвращен timestamp с последней новостью. Можно даже создать 100к txt статических файлов для каждого клиента и раздавать их через nginx или CDN. А для того чтобы «пнуть клиента», достаточно в txt файл записать новый timestamp.