メタデータ
メタデータとは何か、どのように送信されるか、そして何に使用されるかを説明します。
メタデータ
概要
メタデータは、クライアントとサーバーが RPC に関連付けられた情報を互いに提供できるようにするサイドチャネルです。
gRPC メタデータは、初期または最終的な gRPC リクエストまたはレスポンスと共に送信されるキーと値のペアのデータです。認証資格情報、トレーシング情報、カスタムヘッダーなどの追加情報を提供するために使用されます。
gRPC メタデータは HTTP/2 ヘッダーを使用して実装されます。キーは ASCII 文字列ですが、値は ASCII 文字列またはバイナリデータのいずれかになります。キーはケースインセンシティブであり、gRPC 自体が予約している grpc- というプレフィックスで始まることはできません。
gRPC メタデータは、クライアントとサーバーの両方で送受信できます。ヘッダーは、RPC コールの初期リクエスト前にクライアントからサーバーへ、同様に初期レスポンス前にサーバーからクライアントへ送信されます。トレーラーは、サーバーが RPC をクローズする際に送信されます。
gRPC メタデータは、以下のようなさまざまな目的で役立ちます。
- 認証: gRPC メタデータを使用して、認証資格情報をサーバーに送信できます。これは、標準の HTTP Authorization ヘッダーを使用して、
OAuth2やJWTなどのさまざまな認証スキームを実装するために使用できます。 - トレーシング: gRPC メタデータを使用して、トレーシング情報をサーバーに送信できます。これは、分散システム全体のリクエストの進行状況を追跡するために使用できます。
- カスタムヘッダー: gRPC メタデータを使用して、カスタムヘッダーをサーバーまたはクライアントに送信できます。これは、ロードバランシング、レート制限、またはサーバーからクライアントへの詳細なエラーメッセージの提供など、アプリケーション固有の機能を実装するために使用できます。
- 内部使用: gRPC は HTTP/2 ヘッダーとトレーラーを使用しており、これらはアプリケーションで指定されたメタデータと統合されます。
コアコンセプト を参照してください。
注意点
WARNING: Servers may limit the size of Request-Headers, with a default of 8 KiB suggested.
カスタムメタデータは、「Custom-Metadata」形式に従う必要があります。これは PROTOCOL-HTTP2 に記載されていますが、バイナリヘッダーは base64 でエンコードする必要はありません。
ヘッダー
ヘッダーは、クライアントからサーバーへの初期リクエストデータメッセージの前に送信され、同様にサーバーからクライアントへの初期レスポンスデータの前に送信されます。ヘッダーには、認証資格情報や RPC の処理方法などが含まれます。承認などの一部のヘッダーは、gRPC によって自動的に生成されます。
カスタムヘッダーの処理は言語に依存し、一般的には インターセプター を通じて行われます。
トレーラー
トレーラーは、メッセージデータの後に送信される特別な種類のヘッダーです。これらは RPC の結果を通信するために内部的に使用されます。アプリケーションレベルでは、カスタムトレーラーを使用して、サーバーの利用状況やクエリコストなど、データに直接関係しない情報を通信できます。トレーラーはサーバーのみによって送信されます。
詳細については、以下の gRFC を参照してください。
- 提案: G1 バイナリメタデータ
- 提案: L7 go メタデータ API
- 提案: L48 node メタデータ オプション
- 提案: L42 python メタデータ フラグ
- 提案: L11 ruby インターセプター
言語サポート
| 言語 | 例 | 注記 |
|---|---|---|
| Java | Java ヘッダー Java エラー処理 | |
| Go | Go メタデータ Go メタデータ インターセプター | Go ドキュメント |
| C++ | C++ メタデータ | |
| Node | Node メタデータ | |
| Python | Python メタデータ | |
| Ruby | 今後の例 |