xenon
@xenon
Too drunk to fsck

Как по сети оповестить одного из сотен-тысяч клиентов?

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

Клиент - собственное приложение, на python, крутится на linux (десктоп).

Как организовать это оповещение? Хочется решение и простое и безопасное и легкое для сервера.
Наверное, подошел бы RabbitMQ или другой message broker, но не хочется пускать в rabbitmq много не доверенных клиентов. (Безопасно ли это?)

Сейчас рабочая версия - сделать websocket сервер и через него оповещать. Но это тоже не очень нравится:
1. Все равно будут сотни коннектов (даже пустых), это, может быть нагрузкой на сервер
2. Как поведут себя коннекты если по нему сутки не будет ничего пролетать?
3. Есть ощущение, что это будет какой-то "велосипед", повторение уже созданной задачи.

Есть ли готовый сервер для таких задач (задача-то типовая, как мне кажется)?

Может быть есть даже сервис, чтобы на своем железе ничего не крутить, а мое серверное приложение само будет клиентом для сервиса, отсылать оповещение в сервис, откуда уже его будут получать клиенты?
  • Вопрос задан
  • 267 просмотров
Пригласить эксперта
Ответы на вопрос 1
vistoyn
@vistoyn
программист
RabbitMQ не подойдет. Это для микросервисной архитектуры.
То что ты говоришь, называется web push уведомлениями.
Почитай алгоритм как они работают, и сделай также.
Вроде как есть https://gotify.net/ и клиент под него

Проблема с вебсокетами в том, что на каждого подключённого клиента, на сервере будет выделяться память. И если много клиентов одновременно будут держать открытые соединения, то может память сервера кончится, и надо будет масштабировать сервер.

Как вариант можно юзать UDP протокол. Там не тратится память. Но надо будет решить проблему с NAT. NAT на клиенте можно обойти через проброс портов на роутере. Есть даже автоматический проброс портов через UPnP. Но это не везде будет работать. Где не работает, там вебсокеты.

Как идея второй вариант:
Если обновления происходят раз в час, или раз в неделю, и задержка в 5-10 минут не критична, то можно следующее решение. Клиент по таймауту раз в несколько минут отправляет post запрос (чтобы не кэшировался), где будет возвращен timestamp с последней новостью. Можно даже создать 100к txt статических файлов для каждого клиента и раздавать их через nginx или CDN. А для того чтобы "пнуть клиента", достаточно в txt файл записать новый timestamp.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы