2011-12-04 10 views
4

私はScalaでWebアプリケーションを開発しています。クライアントからのポート(JSONまたはProtoBufs)でデータを取得し、データベースサーバーを使用して計算を行い、クライアントにJSON/Protobufオブジェクトを返すシンプルなアプリケーションです。Java/Scalaリソースの消費とロード

非常に重いアプリケーションではありません。最大1000行のコードすべてのクライアント要求にスレッドが作成されます。リクエストを取得してから返信するまでの時間は、20〜40msです。

私はどのような種類のハードウェア/セットアップを使って1秒あたり3000件以上のリクエストを処理するべきかアドバイスが必要です。私は自分のデータセンターに置くためにハードウェアを調達する必要があります。

Javaアプリケーションを大規模に展開している経験がある方は、アドバイスをお願いします。私は32GBのRAMまたは複数の小さなマシンで2 - 4 Xeon 5500sと1つの大きなボックスを使用する必要があります。

更新 - 私たちは多くのクライアントを持っていません。そのうちの3 - 4個。リクエストはこれらの3人からのものになります。

+4

まず、すべてのクライアントリクエストにスレッドを作成しないようにアプリを最適化します。スレッドプールを使用します。その後、測定し、実験してください。 –

+0

SoapUIまたは類似のツールを使用して負荷を測定できます。このようにして、特定のタイプのマシンがアプリケーションに必要な負荷をどのように処理するかをテストできます。 –

+0

更新情報を忘れていました。今私は、単一のソケットから複数の要求を取得するスレッドでHTTPパイプラインを使用しようとしています。スレッドの数が下がるはずです。 –

答えて

2

各要求に平均30msかかる場合、1つのコアでは1秒あたりわずか30要求しか処理できません。あなたのアプリケーションが直線的に(おそらく最良のシナリオで)スケールすると仮定すると、3000 req/sに到達するには少なくとも100コアが必要です。これは2-4Xeon以上です。アプリIO上またはDB(最も有用なアプリケーションなど)に依存している場合

最悪、

がこれを行うにはまず最初にすることです...あなたはサブリニアスケーリングを取得すると、あなたはより多くを必要とするかもしれませんアプリケーションの分析と最適化を行います。ここではいくつかのヒントがあります:

  • は、スレッドの作成(Javaで例えばExecutorServiceを参照)スレッドの限られた数を作成し、要求の中でそれらを再利用しようとすると、高価です。
  • アプリがIO集約型の場合:メモリ内のキャッシュを使用してできるだけIOコールを減らし、ノンブロッキングIOを試行してみてください。
  • アプリケーションがデータベースに依存している場合は、キャッシングを検討し、可能であれば分散ソリューションを試してください。
+0

はい、そのデータベースに依存しますが、16 GBのRAMを備えた近くのマシンに10 GBのRedisベースのキー値が格納されるため、ボトルネックにはなりません。したがって、DB全体がそのメモリ内にあり、読み取りは高速です。 –

+0

ボトルネックではないことを測定する必要があります...(スレッド数を減らしただけでは十分ではありません) – paradigmatic

+0

クラウドを使用することはこのようなアプリには適していると思いますか?または独自のクラスタを使用する必要があります。 ?? –