service discoveryとは何か? サービスを動的に見つける
service discoveryは、サービスが互いを動的に見つける仕組みで、ハードコードされたendpointに頼るのではなく、registryから現在のインスタンスのアドレスを参照します。
動的な環境では、サービスのインスタンスが絶えず起動、停止、移動するため、アドレスが変わります。service discoveryは何がどこで動いているかのライブなregistryを保持し、クライアントはそれを問い合わせて健全なインスタンスを見つけます。これが、誰も接続文字列を手で更新することなく、deployがインスタンスを追加・削除できる理由です。
ライブなregistry
インスタンスは起動時に自身を登録し、停止時に登録を解除します。クライアントはregistry、またはそれを裏に持つDNSやproxy層を問い合わせて、サービスの現在のアドレスを見つけます。
client-sideとserver-side
- client-side: クライアントがregistryを問い合わせてインスタンスを選びます。
- server-side: load balancerがそれを問い合わせ、クライアントに代わってルーティングします。
- DNSベース: registryはDNSルックアップを通じて公開されます。
健全性と登録解除
discoveryはhealth checkと統合され、健全なインスタンスのみが返されるようにします。checkに失敗したインスタンスはregistryから削除され、トラフィックがそこへ向かわないようにします。
deploymentにおけるservice discovery
deployが新しいインスタンスを起動すると、それらは登録して直ちにトラフィックの受信を開始し、古いものはドレインしながら登録を解除します。この動的なメンバーシップが、rolling deployをシームレスにします。
なぜルックアップが失敗するのか
サービスがまだ登録されていない場合、またはdeploy中にregistryが一時的に不整合な場合、クライアントは健全なインスタンスを見つけられず、メンバーシップが落ち着くまで呼び出しが失敗します。
一時的なdiscoveryの空白
まだどのインスタンスも登録されていない一瞬の空白は一時的であり、deployが落ち着くにつれて解消します。Latchkeyのrunnerは、deploy検証中に一般的なendpointへの一時的なdiscoveryおよび接続の失敗をretryするため、registryの短い空白でステップが失敗することはありません。
重要なポイント
- service discoveryは、クライアントがライブなregistryから現在の健全なインスタンスを見つけられるようにします。
- health checkと統合され、シームレスなrolling deployを可能にします。
- deploy中のregistryの短い空白は一時的であり、通常はretryで解消します。