Каков механизм проталкивания на стороне сервера grpc?

Пока я пишу сервис с grpc, я пытаюсь сравнить http / 2 с websocket по механизму проталкивания на стороне сервера.

Я знаю, что для веб-сокета клиент отправит запрос с заголовками Upgrade: WebSocket и Connection: Upgrade на сервер и установит долговременное соединение. Затем сервер будет свободно отправлять данные после того, как соединение будет установлено.

Но для grpc, поскольку он маршрутизируется по http / 2, со страницы вики, https://en.wikipedia.org/wiki/HTTP/2_Server_Push, в нем говорится, что серверу необходимо предсказать потенциальные запросы, которые отправит клиент, и отправить кадр PUSH_PROMISE как можно раньше.

Вот два моих вопроса:

  1. Означает ли это, что серверу также необходимо будет получить соответствующий ответ (запрос) от клиента в ответ на этот заголовок PUSH_PROMISE, чтобы решить, хочет ли клиент получить или отклонить определенный push?

  2. В Grpc, если у меня есть потоковая передача на стороне сервера, скажем, отправляйте сообщение с сервера каждые 1 секунду. Означает ли это, что серверу необходимо отправлять PUSH_PROMISE клиенту каждую 1 секунду или, по крайней мере, перед каждым фреймом данных, который сервер отправляет клиенту?


person Shiyu    schedule 24.06.2019    source источник


Ответы (1)


gRPC в настоящее время не поддерживает / не использует PUSH_PROMISE.

Потоковые RPC в gRPC используют потоки HTTP / 2; весь RPC содержится в запросе / ответе в HTTP. Основное отличие состоит в том, что реализации HTTP / 2 обычно позволяют таким потокам быть потоковыми и двунаправленными (клиент может отправлять больше в запросе после прочтения части ответа), в то время как в HTTP / 1 это было случайным.

В gRPC клиент всегда будет инициировать RPC. Но для потоковой передачи сервер может затем ответить несколькими сообщениями через поток. Это будет похоже на сценарий, который вы описали с веб-сокетами.

person Eric Anderson    schedule 24.06.2019
comment
Спасибо! Итак, в чем смысл этого PUSH_PROMISE, если мы можем просто проталкивать от сервера к клиенту, я думаю, он просто добавляет сложности с помощью такого термина, как «предсказывать» запросы, верно? А пока, как я заметил, ни один браузер не поддерживает grpc, поэтому я немного смущен объяснением в вики выше. - person Shiyu; 24.06.2019
comment
Серверный push предназначен для другого варианта использования. Это позволяет серверу предварительно заполнить кеш клиента, что может удалить RTT для небольших важных ресурсов. - person Eric Anderson; 24.06.2019