2009-04-18 11 views
3

私は、ハードウェアインタフェース用の組み込みシステムとシステムプログラミングで現在まで の仕事をしています。楽しく個人的な知識のために、最近私はErlangに手を濡らした後にサーバープログラミングについて学びたいと思っています。私はC++/Javaの将来の見通しからサーバを考え直してきましたが、今はC++やJavaなどのテクノロジーを使ってスケーラブルなシステムを構築する方法が不思議です。サーバの設計と実装

私が原因コンテキストスイッチングと限られたメモリに、クライアントごとのスレッドハンドラは現実的ではないことを読みました。通常、スレッドプールが作成され、要求を処理するためにワーカースレッドと非同期I/Oが混在しています。まず、スレッドプールサイズをどのように決定するのでしょうか?最適なバランスを測定して見つけるだけですか?最終的にシステムの規模が拡大するにつれ、要求を処理するために複数のサーバーが必要になる可能性があります。大規模なクライアントベースを扱う複数のサーバー間で要求をどのように管理していますか?

私はちょうど私がより多くのを読んで、私の質問の答えを見つけることができるかもしれないどこにいくつかの方向を探しています。この分野の詳細については、コンピュータサイエンスのどの領域を調べますか?このコンピューティング分野の設計パターンはありますか?

+0

私はこの質問に感謝しますが、多分それは1つに包まれた4つまたは5つのクエストです。 – ojblass

答えて

1

、それは非常に近代的なC++のだ、とで動作するようにかなりplesant。また、C++ 0xネットワークライブラリはASIOの実装に基づいているため、貴重な知識です。

クライアントごとに1つのスレッドについては、既に学習したように、動作しません。また、高性能マルチスレッドの場合、最良のスレッド数はCoresX2と思われますが、サーバーの場合は1リクエストあたりIOが多く、アイドル状態の待機が多いことを意味します。経験から見ると、スレッド数はデータベースサーバーの場合はCoresX10、Webサーバーの場合はCoresX40であり、これは理想ではありませんが、成功したシステムのパターンと思われるので、システムあなたはあなたのデザインが完全に厄介ではないことを知っている以上、同じ数字で最適に動作するようにバランスを取ることができます。

3

あなたの質問は素晴らしい答えを得るにはあまりにも一般的です。答えはコンテキスト、1つのスレッドの処理量、要求の到着速度、使用されているCPUファミリ、使用されているWebコンテナなどの多くの要因によって大きく異なります。

1

ローターのように、我々は、C++コードで非同期イベントおよび非同期I/Oを処理するための原子炉とproactorパターンが含まれているACEライブラリを使用します。必要に応じて(構成可能な最大値まで)成長し、時間の経過とともに縮小するかなりのワーカースレッドプールを使用します。

C++でのトリックの一つは、あなたが(言語によって処理されていない)ネットワークの境界を越えて、例外やエラー状況を伝播しようとしている方法です。これらのネットワーク境界を越えて例外をスローする方法は.NETにあります。あなたが考えるかもしれ

ことの一つは、より高いレベルの分散システムの問題に対処するためのSOA(サービス指向アーキテクチャ)を検討しています。 ACEは本当にマシンのベアメタルで動いている場合です。私はブースト:: ASIOを使用していたC++用

関連する問題