カスタム名前解決
標準の名前解決、カスタム名前解決インターフェース、および実装方法について説明します。
カスタム名前解決
概要
名前解決は、基本的にサービスディスカバリに関するものです。gRPCリクエストを送信する際、クライアントはサービス名のIPアドレスを決定する必要があります。名前解決は、しばしば DNS と同じものとして考えられます。しかし実際には、名前解決を可能にするために、DNSは拡張されたり、完全に置き換えられたりすることがよくあります。
gRPCクライアントでリクエストを行う際、デフォルトではDNS名前解決が使用されます。しかし、さまざまな他の名前解決メカニズムが使用される場合があります。
| Resolver | 例 | 注記 |
|---|---|---|
| DNS | grpc.io:50051 | デフォルトでは、DNSが想定されています。 |
| DNS | dns:///grpc.dokyumento.jp:50051 | 余分なスラッシュは、権威(authority)を提供するために使用されます。 |
| Unixドメインソケット | unix:///run/containerd/containerd.sock | |
| xDS | xds:///wallet.grpcwallet.io | |
| IPv4 | ipv4:198.51.100.123:50051 | 一部の言語のみでサポートされています。 |
注記
上記のトリプルスラッシュ (///) は、https://grpc.dokyumento.jp のようなHTTPのダブルスラッシュに慣れていると、見慣れないかもしれません。これらのターゲット文字列は、RFC-3986 URIの形式に従っています。最初の2つのスラッシュの後の文字列で、3番目のスラッシュ (もしあれば) の前の文字列が権威 (authority) です。権威文字列は、すべてのリソースのURIを含むサーバーを識別します。従来のHTTPリクエストの場合、URI上の権威はリクエストが送信されるサーバーです。他の場合では、権威は名前解決サーバーのIDとなり、リソース自体は別のサーバーに存在します。一部の名前解決では権威を必要としません。この場合、権威文字列は空のままとなり、3つのスラッシュが連続します。多くの言語で、ユーザーが独自の名前解決を定義できるインターフェースがサポートされています。これにより、任意の名前を解決する方法を定義できます。登録されると、スキーム my-resolver を持つ名前解決は、ターゲット文字列が my-resolver: で始まる場合に取得されます。たとえば、my-resolver:///my-service へのリクエストは、my-resolver 名解決の実装を使用するようになります。
カスタム名前解決
DNSを拡張または置き換えてサービスディスカバリを行いたい場合は、カスタム名前解決の使用を検討してください。たとえば、このインターフェースは過去に Apache Zookeeper を使用してサービス名を検索するために使用されました。また、Kubernetes APIサーバーと直接連携して、ヘッドレスサービスリソースに基づくサービス検索に使用されることもあります。
標準DNSよりもカスタム名前解決を使用する理由の1つは、このインターフェースがリアクティブであることです。標準DNSでは、クライアントは接続開始時に特定サービスの住所を検索し、接続のライフタイム中にその住所への接続を維持します。しかし、カスタム名前解決はウォッチベースにすることができます。つまり、名前サーバーから時間とともに更新を受信できるため、バックエンドの障害、バックエンドのスケールアップ、スケールダウンにインテリジェントに応答できます。
さらに、カスタム名前解決はクライアント接続にサービス設定 (service config) を提供できます。サービス設定は、特定のサービスへのトラフィックのルーティング方法やロードバランシング方法を定義する任意のJSONオブジェクトです。基本的なものでは、特定のサービスでラウンドロビンロードバランシングポリシーを使用するか、ピックファーストを使用するかなどを指定できます。しかし、カスタム名前解決と任意のサービス設定、および カスタムロードバランシングポリシー を組み合わせて使用すると、xDSのような非常に複雑なトラフィック管理システムを構築できます。
ターゲット文字列のライフサイクル
カスタム名前解決の正確なインターフェースは言語ごとに異なりますが、一般的な構造は同じです。クライアントは、プロセスの開始時に、プロセスのグローバルレジストリに名前解決プロバイダーの実装を登録します。名前解決プロバイダーは、gRPCライブラリによって、カスタム名前解決を対象としたターゲット文字列とともに呼び出されます。そのターゲット文字列が与えられると、名前解決プロバイダーは名前解決のインスタンスを返します。これはクライアント接続と連携して、ターゲット文字列に従ってリクエストを指示します。
sequenceDiagram
Client ->> gRPC: Request to my-resolver:///my-service
gRPC ->> NameResolverProvider: requests NameResolver
NameResolverProvider -->> gRPC: returns NameResolver
gRPC ->> NameResolver: delegates resolution
NameResolver -->> gRPC: addresses
言語サポート
| 言語 | 例 |
|---|---|
| Java | 例 |
| Go | 例 |
| C++ | サポートされていません |
| Python | サポートされていません |