Ответ
В 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()) сообщений в потоке.
Ответ 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() (чтобы самому лить). Главное — не перепутай, где какой поток, а то получишь пизды вместо данных. Выбирай тип, исходя из задачи, а не потому что "о, этот словечко покруче звучит".