EventStreams (SSE) - трансляция обновлений для клиентов.Является ли это возможным? - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть React web application и REST API (Express.js).

Я обнаружил, что использование EventStream - лучший выбор, если вы не хотите использовать длинные опросы или сокеты (не нужно отправлять данные клиенту -> серверу).

Вариант использования:

  1. Пользователь открывает страницу с пустой таблицей, куда другие пользователи могут добавлять данные с помощью POST /data.
  2. .таблица заполняется исходными данными из API на GET /data.
  3. Затем страница подключается к EventStream на /data/stream и ожидает обновления
  4. Кто-то добавляет новую строку, и таблицу необходимо обновить...

Возможно передать это изменение (добавлена ​​новая строка) из бэкэнда (контроллер для добавления строк) всем пользователям, которые подключены к /data/stream?

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Как правило, не рекомендуется извлекать исходные данные, а затем использовать отдельный поток обновлений.Это связано с тем, что существует окно, в которое данные могут поступать на сервер между начальным извлечением и текущим потоком обновлений.

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

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

Клиент создает EventSource для инициирования потока SSE.Сервер отвечает данными, которые уже есть, и после этого публикует любые новые данные, которые поступают на сервер.

Если вы хотите, сервер может включать идентификатор события в каждое сообщение.Затем, если клиент будет отключен, клиент SSE автоматически восстановит соединение с last-event-id, и поток данных возобновится с того места, где он остановился.На стороне клиента автоматическое переподключение и возобновление с last-event-id происходит автоматически, как это предусмотрено стандартом.Разработчику не нужно ничего делать.

SSE - это что-то вроде запроса HTTP / REST / XHR, который остается открытым и продолжает потоковую передачу данных, поэтому вы получаете лучшее из обоих миров.API является легким, простым для понимания и основанным на стандартах.

0 голосов
/ 20 сентября 2019

Я попытаюсь ответить самому себе:)

Я никогда не думал, что смогу использовать только какую-нибудь систему пабов / подсистем на бэкенде.Каждый пользователь, который подключается к потоку (/data/stream), получает подписку, и сервер просто публикует при получении новой строки от POST /data

...