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つのストリームは独立して動作し、サーバーは応答する前にすべてのクライアントメッセージを待つ必要はありません。リアルタイムのインタラクティブ通信パターンを実現します。

ユースケース

リアルタイムチャットシステム、ストリーミングデータを持つライブダッシュボード、進行状況追跡付きファイルアップロードサービス、または持続的な双方向通信チャネルを必要とするアプリケーションの構築。

試してみる — Protobuf Definition Parser

フルツールを開く