web-dev-qa-db-ja.com

サーバーでホストされているRestful Webサービスのスケーリング

アプリケーションサーバー(Apache)にRESTful Webサービスをデプロイしました。ボリュームが大きくなっているので、スケーリングしたいと思います。さらに2つのマシンに2つのApacheインスタンスをデプロイします。

ラウンドロビン戦略に基づいてこれらのそれぞれにリクエストを送信するレイヤーを実装するにはどうすればよいですか?

現在、私はwww.mywebservice.com/employees?id=1 等々。

これらを別のインスタンスにリダイレクトするにはどうすればよいですか?何層かのファサードが必要になるので、どこにレイヤーが入るのか混乱しています。

3
Learner_101

私の経験では、サーバーをスケーリングする最良の方法は、個別のロードバランサーを使用してネットワークレベルで行うことです。

これはWebサーバーの前にあり、受信リクエストを特定のWebサーバーに転送します。これを行うには、非常に複雑なルールを設定できます。

例えば:

リクエストにバージョンヘッダーを追加して、ロードバランサーにリクエストを正しいバージョンのサービスにダイレクトさせることができます。

ダウンタイムなしでアップグレードできるサーバーの青/緑のグループを用意できます。

各サーバーの応答時間に基づいて負荷を割り当てることができます

これをアプリケーションコードに実装しようとする場合の問題は、リクエストがそのレベルに達すると、ボックスがすでに機能していることです。これは、負荷分散で回避しようとしていることです

2
Ewan

Ewan が言ったように、ロードバランサーが必要になります。それらのいくつかは「リバースプロキシ」として知られています。

例には PoundHAProxy が含まれます。

WebサービスがAmazon Web Servicesでホストされている場合は、組み込みのElastic Load Balancingを使用できます。これには、自動スケーリングやその他の多くの機能も含まれています。

インスタンスを追加する前に、次のことを考慮する必要があることに注意してください。

  • 制約要因は何ですか:CPU、メモリ、I/O。これは、適切なサーバー/インスタンスを選択する上で重要です
  • 制約はどこですか:SSL/TLSデコード、Webサーバー、スクリプト、またはデータベース
  • データベースを使用していて、制約がデータベースにない場合、単一のデータベースを使用して複数のフロントエンドを共有するか、または複数のデータベースが必要になるか(その場合、マスタースレーブレプリケーション、マスターマスターなど)。
  • 書き込みを行い、複数のデータベースインスタンスがある場合、それらの書き込みをどのように処理するか
  • 同様に、一時ファイルを保存する場合、またはローカルに保存されたデータを使用してセッションを使用する場合、異なるインスタンスへの1つのセッション内でリクエストを処理する方法
  • セッションを特定のインスタンスに「固定」する必要があるかどうか

多くのインスタンス間で分割するのが非常に簡単なケースもあります。他の人は、より多くの計画、あなたのスクリプトがどのように機能するかについての十分な知識、そして結果についての注意深い考察を必要とします。

また、場合によっては、インスタンス数のスケーリングを試みる適切な場所に関連するキャッシュを追加する方が、簡単で効果的で安価な場合があります。

4
jcaron