NetflixがSimian Armyに代わる'フェール・アズ・ア・サービス'を構築

QCon New York 2015で,Kolton Andrus氏は,NetflixのFIT(Failure Injection Testing)プラットフォームについて講演した。Netflixの運用Webサービス上で,特定のユーザグループに対して,任意の障害シナリオを挿入することができる。FITは同社の‘反脆弱(anti-fragile)’文化を支えると同時に,システムの高い耐障害性を実現するための手段でもある。

NetflixのシニアソフトウェアエンジニアであるAndrus氏の講演は,ソフトウェアアプリケーションの障害テストを実際の運用環境で実施するべきとする,主な理由を3つ挙げることから始まった。システムの耐障害性を確立すること,大規模な障害を防止すること,そして,実際に運用されているデプロイメント内の正しい動作を検証することだ。運用環境での大規模な障害テストはホルメシスのようなものだ,と氏は言う。

障害試験はホルメシスの一形態です – 感染することで免疫力を高めるのです。

Andrus氏は,Netflix Tech Blogの記事でも取り上げられた,同社のFIT(Failure Injection Testing)“フェール・アズ・ア・サービス”を紹介した。Netflixにおける障害テストのアプローチは,これまでSimian Armyというツール群を使うものだったが,例外的な環境のユーザにも波及するという,不必要な問題を引き起こす可能性があった。特に‘latency monkey’の影響で,意図しない障害の連鎖が発生することがあるため,Netflixの開発者は,このツールのデプロイを躊躇するようになっていた。

FITアプリケーションの提供するWebベースのユーザインターフェース(UI)では,例えば単一のユーザや,あるいはユーザのコホートというように,障害の範囲を特定することによって,障害テストで見込まれる‘爆発半径’を制限することができる。さらに‘すべての障害を停止する’ボタンも用意されているので,意図しないNetflixユーザが誤って影響を受けたような場合には,FITの障害テストをすべて,即座に中止することも可能だ。

Netflixでは,同社のWebサービスに対するすべての着信トラフィックのルーティング(その他のアクション)を行う,Zuul[という名称のカスタムAPIゲートウェイ/プロキシも使用している。Zuulは,FITプラットフォームの提供する障害メタデータを使用して,対象とする障害スコープ(ユーザ/コホート)から着信した要求を識別し,障害を注入する対象としてマークする。注入可能な障害としては,要求へのレイテンシ追加,任意のHTTP状態コードの返却,エラーのスローなどがある。次の図は,障害の注入が可能なポイントの例を示している。

FIT UIは障害を監視したり,ユーザやデバイスをトレースすることもできる。Andrus氏はNetflixの運用中のWebサイト上で,FITを使ったライブデモンストレーションをしてみせた。氏自身のNetflixアカウントをスコープとして障害の注入を行うと,ホームページに“non-customised film recommendation”が表示された。デモの終了後,障害の注入を無効にした上で自身のアカウントホームページを再ロードすると,通常のパーソナライズされた推奨映画の一覧が再度表示されていた。

Nassim Nicholas Taleb氏の反脆弱性(antifragility, fragilityの反対)の概念も取り上げられた。FITのようなツールを使うことによって,反脆弱なソフトウェア開発プロセスを作ることができるのだという。

アグレッシブな障害テストは堅牢なプログラムだけでなく,反脆弱なプログラム文化をも創造します。

Andrus氏は,Netflixチームでの開発経験を通じて得た自身の考えとして,障害テストが投資に値するものであること,運用環境におけるテストが持続可能であること,このようなテクニックがシステムの耐障害性を強化するものであることを述べて,講演の結論とした。

Kolton Andrus氏の講演“Breaking Bad at Netflix: Building Failure as a Service”に関する詳細は,QCon New York 2015のWebサイトで見ることができる。NetflixのFITアプリケーションはオープンソースにはなっていないが,先日のNetflix Tech Blog記事には,さらに詳しい情報が紹介されている。