ProtobufのストリーミングRPC(サーバー、クライアント、双方向)
protobufでストリーミングRPCメソッドの定義:サーバーストリーミング、クライアントストリーミング、双方向ストリーミング。各パターンの使い分けとパフォーマンス特性を学びます。
Services & RPCs
詳細な説明
ストリーミングRPCパターン
gRPCは4つの通信パターンをサポートします:ユナリ(1リクエスト、1レスポンス)、サーバーストリーミング、クライアントストリーミング、双方向ストリーミング。streamキーワードでストリーミングバリアントを有効にします。
syntax = "proto3";
package chat.v1;
service ChatService {
// ユナリ: 単一リクエスト、単一レスポンス
rpc SendMessage(SendMessageRequest) returns (SendMessageResponse);
// サーバーストリーミング: クライアントが1リクエスト送信、サーバーが多数レスポンス送信
rpc GetMessageHistory(GetHistoryRequest) returns (stream ChatMessage);
// クライアントストリーミング: クライアントが多数リクエスト送信、サーバーが1レスポンス送信
rpc UploadAttachments(stream UploadChunk) returns (UploadResponse);
// 双方向ストリーミング: 両側がストリームを送信
rpc LiveChat(stream ChatMessage) returns (stream ChatMessage);
}
message SendMessageRequest {
string channel_id = 1;
string content = 2;
string sender_id = 3;
}
message SendMessageResponse {
string message_id = 1;
}
message GetHistoryRequest {
string channel_id = 1;
int32 limit = 2;
string before_message_id = 3;
}
message ChatMessage {
string message_id = 1;
string channel_id = 2;
string sender_id = 3;
string content = 4;
int64 timestamp = 5;
}
message UploadChunk {
string filename = 1;
bytes data = 2;
int32 chunk_index = 3;
int32 total_chunks = 4;
}
message UploadResponse {
string file_id = 1;
int64 total_size = 2;
string url = 3;
}
各パターンの使い分け
| パターン | ユースケース |
|---|---|
| ユナリ | シンプルなCRUD操作、結果が限定されたクエリ |
| サーバーストリーミング | 大規模結果セット、リアルタイムフィード、ログテーリング、イベントサブスクリプション |
| クライアントストリーミング | チャンク分割ファイルアップロード、大量データ取り込み、テレメトリレポート |
| 双方向 | チャットアプリケーション、共同編集、マルチプレイヤーゲーム、インタラクティブセッション |
サーバーストリーミングの詳細
サーバーはストリームを閉じる前に複数のレスポンスメッセージを送信します。クライアントはストリーム終了シグナルを受信するまでメッセージを読み取ります。完全な結果が利用可能になる前に処理を開始したいページネーションデータに最適です。
クライアントストリーミングの詳細
クライアントは複数のメッセージを送信してから完了を通知します。サーバーはすべてのメッセージを処理し、単一のレスポンスを送信します。結果を生成する前にクライアントデータを集約するのに便利です。
双方向ストリーミング
両側がいつでも独立してメッセージを送信できます。2つのストリームは独立して動作し、サーバーは応答する前にすべてのクライアントメッセージを待つ必要はありません。リアルタイムのインタラクティブ通信パターンを実現します。
ユースケース
リアルタイムチャットシステム、ストリーミングデータを持つライブダッシュボード、進行状況追跡付きファイルアップロードサービス、または持続的な双方向通信チャネルを必要とするアプリケーションの構築。