В чем разница между потоковой передачей HTTP и событиями, отправленными сервером?

Я понимаю, что потоковая передача HTTP включает в себя отправку клиентом HTTP-запроса, а затем ответ на запрос, отправляемый с течением времени, что позволяет серверу по существу нажимать на клиента. Из того, что я прочитал, кажется, что SSE работают по тому же принципу, но более формализованы. Это близко к правильному пониманию?

Я видел эти вопросы, но они не дали прямого ответа на мой вопрос.

HTTP: каковы отношения между конвейерной обработкой, сохранением активности и событиями, отправленными сервером? Что такое Long-Polling, Websockets, Server-Sent Events (SSE) и Comet?

Я также просмотрел этот https://www.html5rocks.com/en/tutorials/eventsource/basics/#disqus_thread по настройке SSE, и мне кажется, как я представляю, как настроена потоковая передача HTTP.


person Bren    schedule 02.03.2017    source источник


Ответы (2)


SSE на самом деле является формой потоковой передачи HTTP. Это просто HTTP-ответ с типом MIME «текст / поток событий», и он отправляет простые текстовые сообщения, оканчивающиеся двойными символами новой строки.

SSE - это не то, что раньше было невозможно сделать, но веб-сайт должен был использовать соединение WebSocket, длинный опрос AJAX, комету, периодический опрос и т. Д., А теперь с SSE API стандартизирован, а реализация очень проста. Видеть:

https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events

Следует иметь в виду, что SSE не поддерживается в IE, включая Edge и IE Mobile:

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

person rsp    schedule 02.03.2017
comment
Не уверен, почему вас отвергают, это звучит хорошо для меня. Спасибо! - person Bren; 02.03.2017
comment
Итак, в чем разница на самом деле? Этот вопрос не дает ответа на этот вопрос. Если оба они одинаковы (кроме заголовка типа mime, как вы говорите), то какой смысл даже вводить SSE, когда у нас уже есть потоковая передача http? Я чувствую, что в этом вопросе есть нечто большее. - person theprogrammer; 14.02.2019
comment
@theprogrammer - это стандартизация того, что раньше было «слабо определенным». Он также представил более простые API-интерфейсы браузера для решения этой проблемы. - person Evert; 10.07.2020
comment
MDN говорит: When not used over HTTP/2, SSE suffers from a limitation to the maximum number of open connections, which can be especially painful when opening multiple tabs, as the limit is per browser and is set to a very low number (6) Что вы можете сказать об этом по состоянию на 2020 год? Этот лимит все еще присутствует? Если да, то мы не должны использовать эту технологию в первую очередь и отдавать предпочтение таким вещам, как соединения WebSocket? Что вы думаете? Спасибо! - person tonix; 09.10.2020

IMHO, события, отправленные сервером HTTP2, имеют более широкие возможности, чем HTTP Streaming.

В однонаправленном потоке данных (Сервер - ›Клиент), где клиентская сторона может быть организована на основе внутренних событий, отправленные сервером события могут быть хорошим выбором.

Например:

# ---------- client side -----------

const eventSource = new EventSource("//your-api/workflow/state");

eventSource.addEventListener("queued", function(event) {
    ...
}
eventSource.addEventListener("started", function(event) {
    ...
}
eventSource.addEventListener("failed", function(event) {
    ...
}
eventSource.addEventListener("success", function(event) {
    ...
}

Ограничения событий, отправляемых сервером:

  • События SSE используют открытые соединения браузера.
  • Существует ограничение на максимальное количество открытых подключений не на уровне вкладки браузера, а на уровне всего браузера.
  • На тот момент, когда я пишу, у Chrome и Firefox оно равно 6 (слишком мало). Это ограничение действует на браузер + домен, поэтому вы можете открыть 6 SSE-подключений на всех вкладках к www.example1. com и еще 6 подключений SSE к www.example2.com.

HTTP-поток

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

Пример сценария:

Допустим, нам нравится передавать клиенту содержимое файла журнала. Либо это может быть огромный файл, либо содержимое файла постоянно обновляется, и мы хотели бы отправить его клиенту (например, хвост журнала). В таком случае поток HTTP (Transfer-Encoding: chunked) может удовлетворить наши потребности.

# ---------- client side -----------
const streamRequest = (url) => {
    fetch(url).then(function (response) {
        let reader = response.body.getReader();
        let decoder = new TextDecoder();
        return readData();
        function readData() {
            return reader.read().then(function ({value, done}) {
                console.log(value)
                if (value) {
                    let newData = decoder.decode(value, {stream: !done});
                    console.log(newData);    
                }
                if (done) {
                    console.log('end of stream');
                    return;
                }
                return readData();
            });
        }
    });
}

Ограничения ответа Stream:

  • В случае потокового ответа (фрагментированного) - HTTP / 2 не поддерживает механизм кодирования фрагментированной передачи HTTP 1.1, поскольку он предоставляет свои собственные, более эффективные механизмы для потоковой передачи данных.
person Sairam Krish    schedule 09.07.2020