Какие типы 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()) сообщений в потоке.

Ответ 18+ 🔞

Давай разжую тебе эти gRPC вызовы, а то смотрю, глаза стекленеют, как у пьяного ежа в тумане. Сидишь и думаешь: "О, хуёво, опять эти протобафы, стримы, унылое говно". А на деле-то всё просто, как три копейки.

Вот представь себе бар. Ты — клиент, бармен — сервер. И есть у вас четыре способа общения, прям как в жизни.

1. Unary RPC (Простой вызов) Это когда ты, как нормальный человек, подходишь и говоришь: "Давай пива". Бармен наливает, ты платишь, идешь на хуй. Один запрос — один ответ. Всё ясно, как божий день.

rpc SayHello(HelloRequest) returns (HelloResponse);

Типа "Привет" — "И тебе не хворать". Пиздец, сложность.

2. Server streaming RPC (Сервер строчит, как пулемёт) А это уже интереснее. Ты такой: "Расскажи мне анекдоты". И этот ёбаный бармен начинает: "Входит мужик в бар...", потом "А вот ещё один...", и так до тех пор, пока у тебя терпения ебать не останется. Ты один раз спросил, а он в ответ — целый поток сознания.

rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);

Типа подписался на рассылку спама от сервера.

3. Client streaming RPC (Клиент заваливает говном) Обратная ситуация. Ты подходишь к бармену и начинаешь вываливать на него все свои проблемы: "Жена заебала, начальник — пидарас, ипотека...". Молча слушает, терпит, весь этот поток твоего нытья. Когда ты наконец выдохся и замолкаешь, он вздыхает и говорит одну единственную мудрую фразу: "Да похуй, выпей ещё". Один ответ на кучу запросов.

rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);

Типа закидал сервер данными, а он тебе один финальный пинок под жопу выдал.

4. Bidirectional streaming RPC (Полный трэш и бардак) А это уже высший пилотаж, ёпта. Ты и бармен начинаете одновременно нести хуйню. Ты: "Пива!". Он: "Денег нет!". Ты: "В долг!". Он: "В жопу!". И так далее, пока кто-то не сломается. Оба могут орать (отправлять данные) и слушать (получать) независимо друг от друга. Идеально для чатов или для выяснения, кто из вас больший мудак.

rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);

Полная анархия, ебать. Каждый орёт своё.

Вот и вся магия, блядь. В Go для этих потоковых плясок с бубном есть специальные штуки — grpc.ServerStream и grpc.ClientStream. У них методы Recv() (чтобы слушать, что тебе льют в уши) и Send() (чтобы самому лить). Главное — не перепутай, где какой поток, а то получишь пизды вместо данных. Выбирай тип, исходя из задачи, а не потому что "о, этот словечко покруче звучит".