Несколько унарных вызовов RPC против длительной двунаправленной потоковой передачи в GRPC? - PullRequest
0 голосов
/ 26 июня 2019

У меня есть сценарий использования, когда многим клиентам необходимо продолжать отправлять большое количество метрик на сервер (почти постоянно). Сервер должен хранить эти события и обрабатывать их позже. Я не ожидаю никакого ответа от сервера на эти события.
Я думаю об использовании grpc для этого. Первоначально я думал, что потоковая передача на стороне клиента подойдет (, как это делает посланник ), но проблема в том, что потоковая передача на стороне клиента не может обеспечить надежную доставку на уровне приложения (т. Е. Если поток между ними закрыт, сколько сообщений отправленные были обработаны сервером), и я не могу себе этого позволить.
Мой мыслительный процесс заключается в том, что я должен либо пойти с двунаправленной потоковой передачей, с подтверждениями в потоке сервера, либо с несколькими унарными вызовами rpc (возможно, с некоторой группировкой событий в повторяющемся поле для повышения производительности).
Что из этого будет лучше?

1 Ответ

2 голосов
/ 26 июня 2019

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

Это означает, что вам нужен ответ. Даже если ответ является просто подтверждением, он все же является ответом с точки зрения gRPC.

Общий подход должен быть «использовать одинарный», если только достаточно большие проблемы не могут быть решены с помощью потоковой передачи для преодоления затрат на их сложность. Я обсуждал это в 2018 году CloudNativeCon NA (есть ссылка на слайды и YouTube для видео).

Например, если у вас несколько бэкэндов, то каждый унарный RPC может быть отправлен на другой бэкэнд. Это может привести к значительным накладным расходам на синхронизацию этих различных бэкэндов. Потоковый RPC выбирает бэкэнд в начале и продолжает использовать тот же бэкэнд. Таким образом, потоковая передача может снизить частоту внутренней синхронизации и обеспечить более высокую производительность при реализации сервиса. Но потоковая передача усложняет ситуацию при возникновении ошибок, и в этом случае это приводит к тому, что RPC становятся долговечными, что более сложно для балансировки нагрузки. Поэтому вам необходимо оценить, обеспечивает ли дополнительная сложность от потоковых / долгоживущих RPC достаточно большую выгоду для вашего приложения.

Обычно мы не рекомендуем использовать потоковые RPC для повышения производительности gRPC. Это правда, что отправка сообщения в потоке происходит быстрее, чем новый унарный RPC, но улучшение исправлено и имеет более высокую сложность. Вместо этого мы рекомендуем использовать потоковые RPC, если это обеспечит более высокую производительность приложения (ваш код) или меньшую сложность приложения .

...