В http2-спецификации, сценарии, когда сервер наполовину закрыл поток (сервер отправил http2.END_STREAM), клиент все еще может отправлять данные (так как он наполовину закрыт).
Рассмотримследующий сценарий gRPC:
- Клиент открывает двунаправленный поток на сервер и начинает отправку данных
- Сервер закрывает поток ответов и отправляет трейлеры состояния (переводится в отправку http2.END_STREAM)
- Клиент продолжает отправлять данные
Четко ли определена семантика в gRPC?
Возможные пути:
- Следуйте по http2-spec: Клиенту разрешено продолжать отправлять данные, которые обрабатываются сервером.
- Не следовать http2-spec: Клиентское соединение неявно прерывается, если сервер закрывает поток.
ПРИМЕЧАНИЕ. Я только что проверил, и похоже, что gRPC для Java следует варианту «не следовать спецификации http2», т. Е. Если сервер закрывает нисходящий поток, то и восходящий поток закрывается.