проблема в том, что потоковая передача на стороне клиента не может обеспечить надежную доставку на уровне приложения (т. Е. Если поток был закрыт между тем, сколько отправленных сообщений было фактически обработано сервером), и я не могу себе этого позволить
Это означает, что вам нужен ответ. Даже если ответ является просто подтверждением, он все же является ответом с точки зрения gRPC.
Общий подход должен быть «использовать одинарный», если только достаточно большие проблемы не могут быть решены с помощью потоковой передачи для преодоления затрат на их сложность. Я обсуждал это в 2018 году CloudNativeCon NA (есть ссылка на слайды и YouTube для видео).
Например, если у вас несколько бэкэндов, то каждый унарный RPC может быть отправлен на другой бэкэнд. Это может привести к значительным накладным расходам на синхронизацию этих различных бэкэндов. Потоковый RPC выбирает бэкэнд в начале и продолжает использовать тот же бэкэнд. Таким образом, потоковая передача может снизить частоту внутренней синхронизации и обеспечить более высокую производительность при реализации сервиса. Но потоковая передача усложняет ситуацию при возникновении ошибок, и в этом случае это приводит к тому, что RPC становятся долговечными, что более сложно для балансировки нагрузки. Поэтому вам необходимо оценить, обеспечивает ли дополнительная сложность от потоковых / долгоживущих RPC достаточно большую выгоду для вашего приложения.
Обычно мы не рекомендуем использовать потоковые RPC для повышения производительности gRPC. Это правда, что отправка сообщения в потоке происходит быстрее, чем новый унарный RPC, но улучшение исправлено и имеет более высокую сложность. Вместо этого мы рекомендуем использовать потоковые RPC, если это обеспечит более высокую производительность приложения (ваш код) или меньшую сложность приложения .