@beem7

На чем сделать нечто похожее на PUSH-уведомления, но чтобы они приходили не в уведомления ОС, а просто в фронт-енд по ws/http?

Я знаю про такие штуки, как push, webpush и т.д., но насколько я понял, эти уведомления могут приходить только в стандартную систему уведомлений Android/iOS/Windows 10/браузера.

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

Примерно выработал такой алгоритм:
1. Пользователь заходит на страницу. При этом сразу отправляется XHR/fetch-запрос к специальному роуту микросервиса.
2. Обработчик роута зависает, ожидая данные в БД. (Либо чекает БД с небольшим интервалом, либо у БД есть метод, который можно вызвать и он зависнет, пока не произойдет какое-то изменение). А если закончился таймаут HTTP, то клиент опять делает такой запрос. То есть long-polling.
3. И тут на сервере происходит некое событие.
4. Обработчик роута перестает висеть и возвращает данные события клиенту.
5. Клиент получает этот ответ от запроса. Возможно, событий несколько (особенно в случае, если в пункте 2 используется sleep).
6. Клиент заново делает запрос, но на этот раз передает id-ы полученных сообщений в параметрах.
7. Сервер удаляет из таблицы сообщения по этим id-ам, а дальше см. пункт 2.

У каждого клиента есть некий accountName, который лежит в каждом сообщении в таблице, и используется и для добавления сообщений (п. 3), и для получения (п. 4), и для удаления (п. 7). Это защищает от
взаимодействия с чужими сообщениями.

Вроде все хорошо, но как быть, если пользователь откроет несколько клиентов с одним accountName? Какой-то из них обязательно прочитает и очистит очередь быстрее других. А надо, чтобы сразу все получали эти данные.

Можно вместо accountName придумать какой-нибудь id каждому клиенту, но как тогда чистить ненужные очереди, ведь теперь они даже кол-вом аккаунтов в системе не ограничены?

В общем, задача не так уж и проста. Может, есть какое-то готовое решение, чтобы самому этот микросервис не велосипедить?
  • Вопрос задан
  • 132 просмотра
Пригласить эксперта
Ответы на вопрос 1
@mitya_k
По технологиям ajax pooling, server sent events и websocket вам в помощь.

А по логике, если не использовать push сообщения, то придется при установке/авторизации приложения сохранять сгенеренный id устройства в БД. И каждое сообщение будет иметь связку с accountName и устройством. Примерно тоже самое делает firabase или другие сервисы отправки пушей
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы