Некоторые события, отправленные сервером, потеряны при повторном подключении EventSource - PullRequest
1 голос
/ 11 октября 2019

В нашем приложении у нас есть SSE-соединение с временем жизни 5 минут, через 5 минут сервер закрывает соединение и клиент автоматически переподключается.

Но здесь проблема: при переподключении клиента может произойти какое-то событие на бэкэндеи оно не будет передано соединению SSE, потому что оно еще не установлено.

Итак, есть некоторые временные интервалы 1-2 секунды, когда мы можем потерять события.

Как мы можем справиться с этим случаем? Каково ваше мнение?

На мой взгляд, у нас есть только один выбор: после каждого переподключения SSE на сервере выполняются дополнительные запросы GET для обновления данных.

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Это именно то, для чего предназначен HTTP-заголовок Last-Event-ID в протокол SSE .

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

На стороне клиента, для вашего конкретного случая использования, вам не нужно ничего делать: когда выполняется повторное подключение SSEон отправляет этот заголовок автоматически, используя идентификатор последних полученных данных.

В главе 5 моей книги «Приложения Data Push с HTML5 SSE» я утверждаю, что вы должны также включить этот же уникальный идентификатор, явно впакет данных JSON, который вы выдвигаете, и вы должны также поддерживать Last-Event-ID, заданный в качестве аргумента POST / GET. Это дает вам гибкость для работы с альтернативными подходами к SSE с длительным опросом, а также означает, что он может работать, если переподключение было выполнено на стороне клиента, а не на стороне сервера. (Первый из них предназначен для поддержки старых браузеров, хотя это становится все менее важным по мере того, как IE вымирает; второй понадобится, если вы реализуете свой собственный механизм keep-alive.)

1 голос
/ 13 октября 2019

Вы можете ставить в очередь события на сервере и удалять события, когда клиент активен.

Независимо от состояния подключения клиента, просто добавьте все события в очередь.

Когда клиент подключен, удалите все события из очереди.

Вместо отправки сообщения напрямую клиентам приложение отправляет его брокеру. Затем брокер отправляет сообщение всем подписчикам (которые могут включать в себя первоначального отправителя), и они отправляют его клиентам.

См. https://www.tpeczek.com/2017/09/server-sent-events-or-websockets.html

...