ひがやすを技術ブログ

電通国際情報サービスのプログラマ

分散システム

システムをWeb層(WebServer、 ServletContainer)、中間層(業務ロジック層、データアクセス層)、リソース層(データベース)に分けて考えます。


中間層をWeb層から切り離しておけば、中間層の負荷がふえたとき、クラスタリングなどで負荷分散することにより、スケーラビリティを確保することができる。
一見美しそうに見えるこの言葉、EJBといえば必ず出てくるこの言葉は、今のほとんどのWebアプリケーションには当てはまらないでしょう。
なぜなら、最近のアプリは、業務ロジックといえるような部分があまりなく、負荷はWeb層に集中するためです。仮に凝ったロジックがあったとしても、CPUをあまり使っているとは思えません。ブラウザやデータベースとの通信、HTMLの組み立て部分がCPU消費のかなりの部分を占めていると思われます。
つまり、中間層よりも先にWeb層が飽和してしまうのです。
Web層が飽和したら、Web層と中間層を一緒にしたサーバをクラスタリング化して横に並べると良いのです。


試してみると直ぐに分かるのですが、リモート通信、オブジェクトのシリアライズのコストはかなりのもの(莫大)です。このコストに見合うだけのメリットが、分散システムにあるとは思えません。
中間層をさらにサブシステムごとなどに物理的に分割した場合、オーバーヘッドは無視できないものになるでしょう。
トランザクションの面でも、分散トランザクションはリスクが伴います。2PCに失敗したときのリカバリーが大変なのです。
運用の面でも1つのサーバが停止するとすべてのシステムが停止すると困るということで、クラスタリング化すると目も当てられないくらい複雑になります。


とはいっても、時間のかかるような処理をぶん回すこともあるでしょう。そのような場合は、バッチ処理用の別サーバを立てるのがお勧めです。