ストリーミングプロバイダのNetflixの技術陣は先頃、ストリーミングの安定性を最大化するために同社が"優先度付きロードシェディング(Prioritized Load Shedding)"を採用した背景と、その成果としてのユーザエクスペリエンスの最大化について説明した。
Netflixは自社開発のAPIゲートウェイであるZuulを使用して、受信する要求の優先順位の区別を行っている。システムが負荷を受けたり、不安定になったりした場合、Zuulは最も優先度の低いトラフィックを抑制する。その上で、システムが安定性を取り戻すまで、計算された優先順位に基づいて、負荷が低減するように段階的な調整を行うのだ。
Zuulの漸進的なロードシェディングにより、2020年にこの実装を展開して以来、大規模なサービス停止は数日程度に抑えられている。その間も、機能が完全に復元されるまで、ユーザは一貫してビデオを視聴することが可能だった。
Netflixの技術陣はこの時の問題について、次のように説明している。
世界中のドライバにとって、渋滞に巻き込まれるというのは、最も苛立たしい経験のひとつです。ちょっとした原因から、場合によっては何の理由もなく、すべての車がノロノロ運転になるのです。Netflixのエンジニアである私たちは、トラフィック管理の方法を常に再設計し、再評価しています。もしも旅行者の緊急度が分かっていれば、全員を待たせるのではなく、車を選択的にルーティングできるのではないでしょうか?
Netflixが目標としているのは、システムが部分的に停止したり、あるいは全機能が停止するような事態に直面した場合でも、ユーザのストリーミングエクスペリエンスの中断を最小限にすることだ。このような障害は、再試行の集中、サービスのスケール不足、不適切なデプロイメント、ネットワーク負荷の急上昇など、さまざまな要因から発生する。この目標を達成する上で中核的存在となっているのが、同社のAPIゲートウェイであるZuulである。
出典: https://netflixtechblog.com/keeping-netflix-reliable-using-prioritized-load-shedding-6cc827b02f94
まず最初に技術陣は、受信するAPIリクエストを、重要度に応じて"non-critical(重要ではない)"、"degraded experience(エクスペリエンス低下)"、"critical(重要)"の3つのカテゴリに分類した。"critlcal"なリクエストのロスはユーザの視聴上の問題に直結するが、"non-critical"なリクエストはユーザエクスペリエンスに影響しない。Zuulに到着したリクエストは、計算された優先度スコアでタグ付けされる。通常は、優先度スコアに関係なく、すべてのリクエストが同じように処理されるのだが、CPU使用率、障害率、レイテンシといったメトリクスが上昇を始めると、Zuulは計算されたしきい値よりも低い優先度のリクエストをドロップする。
ドロップ対象とするリクエストは対象となるバックエンドサービスによって決定されるが、Zuul自身の負荷が高い場合は全体的なドロップを行う。この判断は、Zuulがバックエンドサービスを監視して取得した状態メトリクスに基づいて行われる。これらのメトリクスに基づいて、Zuulは優先度のしきい値を動的に計算し、その計算値よりも優先度の低いリクエストをすべて破棄するのだ。
出典: https://netflixtechblog.com/keeping-netflix-reliable-using-prioritized-load-shedding-6cc827b02f94
各APIリクエストの優先度計算が正しいことを保証するため、Netflixの技術陣は社内開発した障害注入ツール(FIT)を使用して、ユーザの中核的なストリーミングエクスペリエンスが負荷を受けた時に、各タイプのリクエストをシェディングした場合の効果についてテストを行っている。運用環境のソフトウェアシステムを試験する手法であるカオスエンジニアリングを使って、この優先度計算を継続的にテストしているのだ。段階的なA/Bテストでは、実ユーザの小グループが選択されて、Netflixのカオス自動化プラットフォーム(ChAP)がそのユーザのトラフィックに制限をかけた上で、ユーザエクスペリエンスの測定を行う。もしデグレードがあれば、リクエストの優先度を修正する必要がある、ということになる。