Какие типы RPC-вызовов существуют в gRPC?

Ответ

В gRPC существует четыре основных типа RPC-вызовов, которые определяют модель взаимодействия клиента и сервера:

  1. Unary RPC (Унарный вызов)

    • Описание: Классическая модель "запрос-ответ". Клиент отправляет один запрос и ждет один ответ от сервера.
    • Пример в .proto:
      rpc SayHello(HelloRequest) returns (HelloResponse);
  2. Server streaming RPC (Серверная потоковая передача)

    • Описание: Клиент отправляет один запрос, а сервер в ответ отправляет поток (последовательность) сообщений. Клиент читает из потока, пока он не закончится.
    • Пример в .proto:
      rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
  3. Client streaming RPC (Клиентская потоковая передача)

    • Описание: Клиент отправляет на сервер поток сообщений. После того как клиент завершил отправку, он ждет, пока сервер обработает все сообщения и вернет один ответ.
    • Пример в .proto:
      rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
  4. Bidirectional streaming RPC (Двунаправленная потоковая передача)

    • Описание: Клиент и сервер могут отправлять друг другу потоки сообщений независимо друг от друга. Потоки работают полностью независимо, что позволяет реализовывать сложные сценарии взаимодействия, например, чаты.
    • Пример в .proto:
      rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);

Выбор типа вызова зависит от конкретной задачи. В Go для реализации потоковых RPC используются интерфейсы grpc.ServerStream и grpc.ClientStream, которые предоставляют методы для чтения (Recv()) и записи (Send()) сообщений в потоке.