9章サーバディスカバリとクライアント側ロードバランス

私たちは、ディスカバリと合意形成を備えた本物の分散サービスを構築しました。これまでは、サーバに焦点を当ててきましたが、クライアントに関してはgRPCを使うこと以外の変更は行っていません。この章では、サービスの可用性、拡張性、ユーザ体験を向上させる、三つのクライアント機能に取り組みます。クライアントが自動的に、次のことを行うことを可能にします。

  • クラスタ内のサーバを発見します。
  • リーダーに対して書き込みを行い、フォロワーに対して読み出しを行います。
  • フォロワーに対する読み出しをバランスさせます。

これらの改善が終わったら、デプロイの準備ができていることになります。

9.1 三つのロードバランス戦略

ディスカバリとロードバランスの問題を解決するために、三つの戦略が使えます。

  • サーバプロキシserver proxying):クライアントは、(サービスレジストリに問い合わせるか、サービスレジストリとなって)サーバを把握しているロードバランサ(load balancer)にリクエストを送り、ロードバランサがリクエストをバックエンドに中継します。
  • 外部ロードバランスexternal load balancing):クライアントは、サーバを把握している外部ロードバランスのサービスへ問い合わせて、どのサーバにRPCを送信すればよいかを知ります。
  • クライアント側ロードバランスclient-side load balancing):クライアントはサービスレジストリに照会してサーバを知り、RPCを送信するサーバを選び、RPCを直接サーバへ送信します。

サーバプロキシは、最も一般的に使われるディスカバリとロードバランスのパターンです。ほとんどのサーバは、ロードバランスがどのように動作するのかに関する制御を与えるほどにはクライアントを信頼していません。なぜなら、それらの決定はサービスの可用性に影響するかもしれないからです(たとえば、クライアントが一つのサーバを対象にして、そのサーバが使えなくなるまで呼び出すことを可能にします)。クライアントとサーバの間にプロキシを置き、信頼境界として機能させることができます。プロキシは、プロキシの背後にあるすべてのネットワークが外部から隔離されたネットワークであり、信頼され、制御下にあるため、システムがどのようにリクエストを取り込むかを制御できます。サーバプロキシは、サービスレジストリを維持したり呼び出したりして、プロキシ先のサーバを知ります。インターネットからの外部トラフィックをロードバランスするために、AWSのELB( ...

Get Go言語による分散サービス ―信頼性、拡張性、保守性の高いシステムの構築 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.