Ответ
В gRPC существует четыре основных типа RPC-вызовов, которые определяют модель взаимодействия клиента и сервера:
-
Unary RPC (Унарный вызов)
- Описание: Классическая модель "запрос-ответ". Клиент отправляет один запрос и ждет один ответ от сервера.
- Пример в
.proto:rpc SayHello(HelloRequest) returns (HelloResponse);
-
Server streaming RPC (Серверная потоковая передача)
- Описание: Клиент отправляет один запрос, а сервер в ответ отправляет поток (последовательность) сообщений. Клиент читает из потока, пока он не закончится.
- Пример в
.proto:rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
-
Client streaming RPC (Клиентская потоковая передача)
- Описание: Клиент отправляет на сервер поток сообщений. После того как клиент завершил отправку, он ждет, пока сервер обработает все сообщения и вернет один ответ.
- Пример в
.proto:rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
-
Bidirectional streaming RPC (Двунаправленная потоковая передача)
- Описание: Клиент и сервер могут отправлять друг другу потоки сообщений независимо друг от друга. Потоки работают полностью независимо, что позволяет реализовывать сложные сценарии взаимодействия, например, чаты.
- Пример в
.proto:rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
Выбор типа вызова зависит от конкретной задачи. В Go для реализации потоковых RPC используются интерфейсы grpc.ServerStream и grpc.ClientStream, которые предоставляют методы для чтения (Recv()) и записи (Send()) сообщений в потоке.