Должно ли половинное закрытие gRPC на стороне сервера неявно завершать работу клиента? - PullRequest
0 голосов
/ 04 апреля 2019

В http2-спецификации, сценарии, когда сервер наполовину закрыл поток (сервер отправил http2.END_STREAM), клиент все еще может отправлять данные (так как он наполовину закрыт).

Рассмотримследующий сценарий gRPC:

  • Клиент открывает двунаправленный поток на сервер и начинает отправку данных
  • Сервер закрывает поток ответов и отправляет трейлеры состояния (переводится в отправку http2.END_STREAM)
  • Клиент продолжает отправлять данные

Четко ли определена семантика в gRPC?

Возможные пути:

  • Следуйте по http2-spec: Клиенту разрешено продолжать отправлять данные, которые обрабатываются сервером.
  • Не следовать http2-spec: Клиентское соединение неявно прерывается, если сервер закрывает поток.

ПРИМЕЧАНИЕ. Я только что проверил, и похоже, что gRPC для Java следует варианту «не следовать спецификации http2», т. Е. Если сервер закрывает нисходящий поток, то и восходящий поток закрывается.

1 Ответ

1 голос
/ 04 апреля 2019

В семантике gRPC, когда сервер отправляет статус, это означает, что весь вызов завершен.Официальные серверные реализации отправляют RST_STREAM в дополнение к END_STREAM для отключения потока в обоих направлениях на уровне протокола HTTP / 2, в соответствии с этой частью Раздел 8.1 HTTP / 2 RFC :

Сервер может отправить полный ответ до того, как клиент отправит полный запрос, если ответ не зависит от какой-либо части запроса, которая не была отправлена ​​и получена.Если это так, сервер МОЖЕТ запросить, чтобы клиент прервал передачу запроса без ошибок, отправив RST_STREAM с кодом ошибки NO_ERROR после отправки полного ответа (т. Е. Кадр с флагом END_STREAM).

Когда серверы не делают этого, протокол gRPC не запрещает клиенту отправлять больше данных после получения статуса, но сервер не будет их обрабатывать, поэтому нет причин делать это.По этой причине, когда официальные клиенты gRPC получают статус, они считают, что вызов завершен, и прекращают отправку данных.

...