カスタム名前解決

標準の名前解決、カスタム名前解決インターフェース、および実装方法について説明します。

カスタム名前解決

標準の名前解決、カスタム名前解決インターフェース、および実装方法について説明します。

概要

名前解決は、基本的にサービスディスカバリに関するものです。gRPCリクエストを送信する際、クライアントはサービス名のIPアドレスを決定する必要があります。名前解決は、しばしば DNS と同じものとして考えられます。しかし実際には、名前解決を可能にするために、DNSは拡張されたり、完全に置き換えられたりすることがよくあります。

gRPCクライアントでリクエストを行う際、デフォルトではDNS名前解決が使用されます。しかし、さまざまな他の名前解決メカニズムが使用される場合があります。

Resolver注記
DNSgrpc.io:50051デフォルトでは、DNSが想定されています。
DNSdns:///grpc.dokyumento.jp:50051余分なスラッシュは、権威(authority)を提供するために使用されます。
Unixドメインソケットunix:///run/containerd/containerd.sock
xDSxds:///wallet.grpcwallet.io
IPv4ipv4:198.51.100.123:50051一部の言語のみでサポートされています。

多くの言語で、ユーザーが独自の名前解決を定義できるインターフェースがサポートされています。これにより、任意の名前を解決する方法を定義できます。登録されると、スキーム 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サポートされていません