NetflixがFIT(Failure Injection Testing)を導入した。実運用環境でのテストにおいて,Simian army,特にLatency Monkeyによるユーザへの影響を防ぐことが目的だ。
FITでは,テストの限界値を示すメタデータを設定することで,テストのフェール(失敗)による影響をコントロールできる。Zuulのフィルタリング機構がメタデータを参照して,要求コンテキストにテストの限界値を示す情報を追加する。各インジェクションポイントでは,そのコンポーネントにフェールが指定されているかどうか,要求コンテキストをチェックする。そしてフェールならば,コンポーネントがそれをシミュレートする,という仕組みだ。
シナリオのフェールはある種のサービス,あるいは永続性やキャッシュなどサービスの一部の機能の損失として,影響を与える可能性がある。あるいはフェールしたシナリオが,ストリームビデオに必要なサービスの最小セットをテストするものかも知れない。ある種のフェールがサービス呼び出しに遅延を発生させたり,あるいは永続化層などを使用不能にすることも考えられるのだ。
また,テストの影響は徐々に拡大する。この最初のフェールテストがテストアカウントあるいは特定のデバイスで適切に処理されている場合,フェールした要求が,実際の要求のごく少ない割合に影響を与える可能性がある。これらのフェールテストが適切に動作すると,フェールした要求が実際の要求すべてに影響を与えることもあり得る。システムの品質が徐々に低下していることをテスト結果が示していれば,より多くのフェールが起こることになるのだ。
Netflixのサービスは,フェールを挿入するインジェクション点を提供するコンポーネントで構成されている。そのようなコンポーネントの例としては,HystrixやRibbon,EVCache, Astyanaxなどがある。Hystrixはフェールを分離して,フィードバックを定義する。Ribbonは内部ロードバランスを提供するコンポーネントである。EVCacheは分散型インメモリ・キャッシュ,Astyanaxはクライアント用のCassandraライブラリだ。これらのコンポーネントは,Zuulが挿入されている要求のFITコンテントを調べて,サービスの応答方法を決定する。例えば,レイテンシの増加,500台の応答コードの返送,例外のスローなどといったものが考えられる。
テストの実施,あるいは過去の停止を再現しようとする場合に問題となるのは,フェールする可能性があるのは何かを知っておくことだ。内部トレースツールを使えば,要求を追跡して,指定したパス上のインジェクション点をすべて見つけることができる。インジェクション点が見つかれば,それらを使って,前述したようなフェールシナリオを作成することが可能になる。フェールシナリオの本質は,インジェクション点のセットと,それに関連する動作(成功あるいは特定の方法でフェール)である。
Netflixは継続的に実行可能な,自動フェールテストのセットを開発中だ。これらの自動化テストは特定の機能の依存性をすべて特定して,それぞれを個別にフェールさせる。デバイス上のNetflixデバイスをローンチし,選択するビデオを探し,ストリーミングを開始する,という処理が機能の一例として挙げられる。