システムを本当にスケーラブルにするには,参照の局所性の最大化とコンテンションの最小化が必要だ – 初開催のReact Conferenceで行われたスケーラビリティに関するプレゼンテーションで,Jonas Bonér氏はこう説明した。
Akkaプロジェクトの創設者であり,TypesafeのCTOでもある氏は,シェア・ナッシング・アーキテクチャを採用し,イベント駆動を基盤として構築することで,真にスケーラブルなシステムが開発できると考えている。
氏はパフォーマンスを,一定の応答時間を提供するシステムの能力と定義する。それは本質的に3つのものからなる – レイテンシ,スループット,スケーラビリティである。氏の定義するスケーラビリティとは,その応答時間を維持するシステムの能力だ。
スケールアップには,マルチコア・アーキテクチャを効果的に活用する方法が必要である。氏にとって,ひとつの処理を行う小さなメソッドとシンプルなロジックを使った,クリーンなコードと優れたプラクティスがこれを達成する手段なのだ。本当に重要なことが2つある。ひとつは,データの所在をその処理コンテキスト内に限定するという,参照の局所性の最大化の問題であり,もうひとつは,同期ロックの過剰な利用のように,スケーラビリティを阻害するコンテンションの問題だ。
原則は"ブロックをしないこと"だ。非同期を徹底し,非同期メッセージパッシングを全面的に採用することで,並列処理設計のシステムが実現できる。低いレベルのスレッドやロックに頼るのではなく,システムのイベントフロー処理の抽象化レベルを上げることができるのだ。
非同期プログラミングは,最初はその基本的な複雑さに苦労するが,それを一度越えてしまえば,以降に発生する問題のほとんどはごく単純なものに限られてくるはずだ。逆に同期システムでは,基本的な複雑性の低さから最初の難易度は低いものの,システムが拡大するにつれて,すぐに手に負えなくなってくる。状態の相互保持や密接に絡みあったシステムの複雑さに圧倒されてしまうかも知れない。
本当のスケーリングには,システムにリソースを追加する手段も必要だ。つまるところスケールアウトとは,ノードやリソースの追加を柔軟に管理することに他ならない。
スケール・オン・デマンドも重要な要素だ。クラスタあるいはクラウドコンピューティングアーキテクチャを効果的に利用して,オン・ザ・フライのリソース追加を実現することで,アプリケーションはロードの増加のみならず,減少にも対処できるようになる。
実績の積み重ねによって証明された基本原則を忠実に守ってこそ,本当にスケーラブルなシステムを作ることができる,というのが氏の結論だ。