Должен ли быть только один объект EventSource для каждого приложения?

При использовании Сервер -Отправленные события должен ли клиент устанавливать несколько соединений для получения разных событий, в которых он заинтересован, или должно быть одно соединение, и клиент указывает, что его интересует, по отдельному каналу? IMO последний кажется более предпочтительным, хотя для некоторых это может сделать клиентский код более сложным. Спецификация поддерживает именованные события (события, относящиеся к определенной теме ), что, на мой взгляд, предполагает, что соединение Server -Sent Events должно использоваться как единый канал для всех событий.

Следующий код иллюстрирует первый сценарий, в котором инициируются несколько серверных -соединений Sent Event :

var EventSource eventSource1 = new EventSource("events/topic1");
eventSource1.addEventListener('topic1', topic1Listener, false);

var EventSource eventSource2 = new EventSource("events/topic2");
eventSource2.addEventListener('topic2', topic2Listener, false);

. eventSource1 будет получать события "topic1", а eventSource2 будет получать события "topic2". Хотя это довольно просто, это также довольно неэффективно, так как зависание GET происходит для каждой интересующей вас темы.

Альтернатива примерно следующая:

var EventSource eventSource3 = new EventSource("/events?id=1234")
eventSource3.addEventListener('topic3', topic3Listener, false);
eventSource3.addEventListener('topic4', topic4Listener, false);

var subscription = new XMLHttpRequest();
subscription.open("PUT", "/events/topic3?id=1234", true);
subscription.send();

В этом примере будет существовать один EventSource, и интерес к конкретному событию будет указан отдельным запросом с подключением Server -Sent Event, а регистрация будет коррелирована параметром id. Тема3Listener будет получать события "top3", а тема4Listener - нет. Хотя требуется немного больше кода, преимущество заключается в том, что устанавливается только одно соединение, но события по-прежнему можно идентифицировать и обрабатывать по-разному.

В Интернете есть ряд примеров, демонстрирующих использование именованных событий, но кажется, что имена событий (или темы )известны заранее, поэтому клиенту не нужно регистрировать интерес на сервере (. ] пример).Хотя я еще не видел примера, показывающего несколько объектов EventSource, я также не видел примера, показывающего, как клиент использует отдельный запрос для регистрации интереса к определенной теме, как я делаю выше. Моя интерпретация спецификации приводит меня к мысли, что указание интереса к определенной теме (или названию события )полностью зависит от разработчика и что это можно сделать статически, когда клиент знает названия событий, о которых идет речь. собирается получать или динамически с клиентом, предупреждающим сервер о том, что он заинтересован в получении определенных событий.

Мне было бы очень интересно услышать мысли других людей по этой теме. NB :Я обычно разрабатываю Java, поэтому, пожалуйста, простите мой посредственный код JS..:)

12
задан James Tyrrell 26 July 2012 в 15:00
поделиться