カスタム負荷分散ポリシー

カスタムロードバランシングポリシーが、独自の状況下でのロードバランシングを最適化するためにどのように役立つかを説明します。

カスタム負荷分散ポリシー

カスタムロードバランシングポリシーが、独自の状況下でのロードバランシングを最適化するためにどのように役立つかを説明します。

概要

gRPCの主要な機能の1つであるロードバランシングは、クライアントからのリクエストを複数のサーバーに分散させます。これにより、単一のサーバーへの過負荷を防ぎ、サーバーを追加することでシステムをスケールアップできます。

gRPCのロードバランシングポリシーには、名前リゾルバーからサーバーIPアドレスのリストが渡されます。ポリシーは、サーバーへの接続(サブチャネル)を維持し、RPCが送信されたときに使用する接続を選択する責任があります。

独自のポリシーの実装

デフォルトではpick_firstポリシーが使用されます。このポリシーは実際にはロードバランシングを行わず、名前リゾルバーから取得したアドレスを順番に試して、最初に接続できたものを選択します。gRPCサービス構成を更新することで、round_robinに切り替えることもできます。これは、取得したすべてのアドレスに接続し、RPCごとに接続されたバックエンドをローテーションします。他にもいくつかのロードバランシングポリシーがありますが、利用可能なセットは言語によって異なります。組み込みポリシーがニーズを満たさない場合は、独自のカスタムポリシーを実装することもできます。

これには、使用している言語でロードバランサーインターフェースを実装する必要があります。概要としては、以下の操作を行います。

  • サービス構成から参照できるように、実装をロードバランサーレジストリに登録する
  • 実装のJSON構成オブジェクトを解析する。これにより、サービス構成でサポートしたい任意のJSONを使用してロードバランサーを構成できます。
  • 接続を維持するバックエンドを管理する
  • RPCが作成されたときに、どのバックエンドに接続するかを選択するpickerを実装する。これは、RPC呼び出しパス上にあるため、高速な操作である必要があることに注意してください。
  • ロードバランサーを有効にするには、サービス構成で設定します。

具体的な手順は言語によって異なります。お使いの言語での具体的な例については、言語サポートセクションを参照してください。

flowchart TD
NR(Name Resolver) -->|Provides addresses &\nLB config| LB(Load Balancer)
LB --> |Provides a picker| C(Channel)
C -->|Requests\na subchannel| P(Picker)
LB --> |Manages subchannels\nto backends| SC(Subchannel 1..n)
LB -. Creates .-> P
P --> |Picks one| SC

バックエンドメトリクス

バックエンドサーバーに関するリアルタイム情報が必要なロードバランシングポリシーはどうなりますか?これには、バックエンドメトリクスに依存できます。メトリクスは、バックエンドRPC応答のインバンド、またはバックエンドからの個別のRPCとしての帯域外で提供されます。CPUやメモリ使用率などの標準的なメトリクスが提供されますが、独自のカスタムメトリクスを実装することもできます。

これに関する詳細については、カスタムバックエンドメトリクスのガイドを参照してください。

サービスメッシュ

マイクロサービスの設定を中央のコントロールプレーンが調整しているサービスメッシュ環境の場合、サービス構成を通じてカスタムロードバランサーを直接設定することはできません。しかし、コントロールプレーンがgRPCクライアントと通信するために使用するxDSプロトコルを使用してこれを実現するためのサポートが提供されています。カスタムロードバランシング構成がどのようにサポートされているかについては、お使いのコントロールプレーンのドキュメントを参照してください。

詳細については、gRPCの提案A52を参照してください。

言語サポート

言語注記
JavaJavaの例
GoGoの例
C++まだサポートされていません