全3041文字
PR

 システム運用の現場は想像以上に過酷だ。例えば、外部システムからは必ず応答が返ってくるとは限らず、極端に応答が遅かったりタイムアウトしたりすることはよくある。

 こうした厳しい現実を前提としてシステムの可用性を高めるためのソフトウエア設計・開発手法が「レジリエンスプログラミング」である。

 「レジリエンス」という用語は、心理学の分野で「逆境や困難にうまく適応できる能力」や「ストレスフルな状況から回復できる能力」を意味する。

 システムにおいても、ハードウエア障害、ソフトウエアの不具合、トラフィックの急増といった様々なストレスが発生する。そうした場合でも、サービス全体を停止させることなく、ストレスが取り除かれれば自律的に回復する能力という意味で、レジリエンスという用語を使っている。

 レジリエンスをシステム開発に応用することで、トラブルが少ない強じんなシステムを構築できる。

システム全体のダウンを引き起こすカスケード障害

 いまやWebアプリケーションはクラウドでホストされることが当たり前になった。データベースやオブジェクトストレージなどのマネージドサービスを積極的に利用するケースも増えている。

 例えば筆者が開発に関わるプロダクトでは、データベースやオブジェクトストレージの利用にとどまらず、多種多様の外部コンポーネントがネットワーク経由で連係動作することでシステムが成り立っている。メッセージブローカー、キーバリューストア、動画のエンコーディング、PDF変換、メール配送、FAX送信といったコンポーネントだ。

 また、マイクロサービスアーキテクチャーも一般的になってきた。システムを機能のまとまりごとにマイクロサービスとして分割し、ネットワーク経由でマイクロサービスを利用する。

 システムが多数のコンポーネントで構成され、互いにネットワークで接続された大規模な分散システムで課題になるのが、可用性の問題だ。

 クラウド以前のオンプレミスの時代には、アプリケーションはひとかたまりのモノリシックなコンポーネントとして構築されていた。データを保持するデータベースサーバーやファイルサーバーは、ハードウエアレベルで冗長化することで、システム全体の可用性を担保するケースが多かった。

 こうした冗長化による対策は、ハードウエアの障害には有効だ。しかし、データの増加やトラフィックの急増、アプリケーションの機能追加などによる負荷の増加にはあまり効果がない。このため過負荷によりシステムがダウンすることがたびたびあった。