カスタム名前解決

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

カスタム名前解決

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

概要

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

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

リゾルバー注記
DNSgrpc.io:50051デフォルトでは、DNSが想定されます。
DNSdns:///grpc.dokyumento.jp:50051追加のスラッシュは、権限を提供するために使用されます。
Unixドメインソケットuds:///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では、クライアントは接続の開始時に特定のサービスのアドレスを検索し、接続の存続期間中、そのアドレスへの接続を維持します。ただし、カスタム名前リゾルバーはウォッチベースにすることができます。つまり、時間の経過とともにネームサーバーから更新を受信できるため、バックエンドの障害とバックエンドのスケールアップとスケールダウンにインテリジェントに応答できます。

さらに、カスタム名前リゾルバーは、クライアント接続に*サービス設定*を提供する場合があります。サービス設定は、特定のサービスへのトラフィックのルーティング方法と負荷分散方法を指定する任意の設定を定義する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サポートされていません