Можно ли делиться наблюдаемыми между несколькими клиентами, использующими SSE? - PullRequest
0 голосов
/ 21 января 2019

У меня есть служба (ServiceA) с конечной точкой, на которую клиент может подписаться, и после подписки эта служба непрерывно генерирует данные, используя отправленные сервером события.

Если это важно, я использую Project Reactor с Java.

Это может быть важно, поэтому я объясню, что делает эта конечная точка.Каждые 15 секунд он извлекает данные из другой службы (ServiceB), проверяет, были ли какие-либо изменения в данных, которые он получил 15 секунд назад, и, если они были, создает новое событие с этими данными, если изменений не было, он неотправить что-нибудь (поэтому полезная нагрузка для клиента будет как можно меньше).

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

Разумно ли, что эта наблюдаемая производящая продукция распределяется между несколькими клиентами?

Конечно, это избавит нас от множества ненужных звонков в ServiceB, но мне интересно, есть ли какие-либо противопоказания к этому подходу - я впервые пишу реактивную программу на бэкэнде (исходя изRxJS), и я не знаю, вызовет ли это какие-либо проблемы с параллелизмом или какие-либо другие проблемы.

Другое преимущество, которое я вижу, состоит в том, что новому клиентскому соединению немедленно будут предоставлены последние полученные данные отServiceB (для получения этих данных обычно требуется около 4 секунд на вызов).

Мне также интересно, возможно ли, чтобы эта наблюдаемая вызывала ServiceB, только если есть какие-то абоненты - т.е. до тех пор, пока есть хотя бы одинабонент, позвоните в службу, если нет подписчиков, перестаньте звонить ей, когда новый подписчик позвонит, позвоните еще раз, но сначала получите клиенту последние извлеченные данные (независимо от того, насколько они устаревшие или устаревшие).

1 Ответ

0 голосов
/ 23 января 2019

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

source.publish().refCount();

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

Как только все подписчики откажутся от подписки, refCount также отменит свою подписку на первоисточник.После этого первый подписчик активирует новую подписку на source, которую вы должны создать так, чтобы она выбирала самые последние данные и повторно инициализировала цикл опроса каждые 15 с.

...