HTTP / 2 против веб-сокетов для двунаправленной потоковой передачи сообщений - PullRequest
1 голос
/ 22 января 2020

Кроме браузеров, которые не выставляют кадры HTTP / 2 для Javascript, в этом случае Websockets будет лучшим выбором, чем что-то вроде двунаправленных потоковых gRPC (построенных на HTTP / 2) для реализации двунаправленных потоков сообщений в реальном времени ? Кроме того, не означает ли HTTP 2.0, что он является дуплексным (и двунаправленным), означает, что на самом деле поддерживаются запросы сервера? Зачем тогда нужно что-то вроде SSE? Это устарело, верно?

1 Ответ

1 голос
/ 23 января 2020

Здесь много аспектов. События, отправленные сервером, JavaScript Streams API - это в основном API-интерфейсы браузера для протоколов более низкого уровня.

Связь между серверами

Связь между серверами с использованием веб-сокетов и HTTP / 2 имеет аналогичные свойства. Оба являются бинарными и эффективными протоколами. HTTP / 2 обеспечивает обратное давление для каждого потока, что может быть важно для клиентов, которые получают сообщения pu sh из нескольких источников или могут быть заняты время от времени. gRP C является платформой поверх HTTP / 2 и обеспечивает более высокую абстракцию для разработчика.

Обмен данными между сервером и браузером

Отправленные сервером события

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

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

Пример кода

const evtSource = new EventSource("/v1/stream/topic");

evtSource.onmessage = function(event) {
   // handle event
}

JavaScript API потоков

JavaScript API потоков - это более новый JavaScript API для поддержки двоичных потоков между браузером и сервером. Это можно использовать с более новыми ReadableStream из Fetch API . Поскольку это двоичный поток, он может иметь более широкий вариант использования и может быть важен для приложений, использующих, например, веб-сборку, в ближайшие годы.

API-интерфейс немного сложнее. Пример кода:

fetch("https://www.example.org/").then((response) => {
  const reader = response.body.getReader();
  const stream = new ReadableStream({
    start(controller) {
       // implementation
    }
  })

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

Использование JavaScript Streams API on HTTP / 2 или HTTP / 3 Streams имеет преимущество перед альтернативами в том, что он поддерживает противодавление на поток (не только на соединение TCP).

gRP C

gRP C - это протокол, использующий потоки HTTP / 2, но он не реализован в API-интерфейсе JavaScript Streams, поэтому для связи через браузер ему требуется промежуточное программное обеспечение, например grp c -web .

WebSockets

WebSockets - это абстракция более низкого уровня, расширенная поддержка браузеров и полнодуплексная связь. Но так как это абстракция более низкого уровня, для взаимодействия с ней часто требуются библиотеки.

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