Netflixのエンジニアは最近、Distributed Counter Abstraction技術へのディープダイブを発表した。Distributed Counter Abstractionは、ユーザーのインタラクション、機能の利用状況、ビジネス・パフォーマンス・メトリクスを低レイテンシーでグローバルに追跡するために設計されたスケーラブルなサービスである。NetflixのTimeSeries Abstraction技術の上に構築されたこのシステムは、設定可能なカウントモード、弾力性のあるデータ集約、グローバルに分散されたアーキテクチャによって、パフォーマンス、精度、コストのバランスをとっている。
モノのカウントは単純な問題に聞こえるかもしれない。しかし、ネットフリックスのエンジニアは、隠れた複雑さを強調している。
分散カウントは、コンピューターサイエンスの中でも難しい問題です。(中略)Netflixでは、何百万ものユーザーとのインタラクションのトラッキング、特定の機能や体験がユーザーに表示される頻度のモニタリング、A/Bテスト実験中のデータの多面的なカウント、その他にも、カウントに関するユースケースがあります。
本稿執筆時点で、このサービスは、グローバルの異なるAPIエンドポイント群とデータセット群にわたって1秒当たり7万5千件近くのリクエストを処理する一方で、すべてのエンドポイントに対して1桁ミリ秒のレイテンシーを維持している。
様々な分散カウント処理のレイテンシ情報(ソース)
カウントのユースケースの中には、絶対的な精度よりも低レイテンシと最小限のインフラコストを優先し、「ベストエフォートなカウント」を要求するものもある。また、若干の遅延と運用コストの増加を伴うものの、正確で耐久性のあるカウントを保証する「最終的に一貫性のあるカウント」を必要とするケースもある。高可用性、フォールトトレランス、べき等なリトライのサポートは、精度、パフォーマンス、スケーラビリティのバランスを必要とする。
ベストエフォートカウンターは、比較的単純なEVCacheベースの実装で済ませたが、Netflixは、TimeSeries抽象化の上にイベント駆動アーキテクチャを使用して、結果整合性カウンターを実装した。
各カウントアクションは、TimeSeries抽象化において、idempotencyキーとともにimmutableイベントとして記録され、耐久性を確保し、べき等なリトライを可能にする。バックグラウンドのロールアッププロセスは、時間ベースのウィンドウを使用してこれらのイベントを継続的に集約し、中間カウントを永続ストアに格納する。このアプローチにより、データ損失が回避され、データストアのマルチリージョンレプリケーションによる一貫したグローバル集計がサポートされる。
ログに記録されたカウンター・イベントのロールアップ・プロセス(ソース)
分散システムでは、べき等性(Idempotency)が重要な役割を果たす。失敗、再試行、重複要求が一般的なネットワーク環境では、べき等性は、繰り返される操作が1回の実行と同じ結果を生むことを保証し、クライアントが要求を再試行できるようにする。著者らは、このような環境におけるクライアントにとって有用な第二の戦略を強調している。
ヘッジングとは、元のリクエストが予想される時間内に応答を返さなかった場合に、クライアントがサーバーに同一の競合するリクエストを送信することです。クライアントは、どちらか先に完了したリクエストに応答します。これは、アプリケーションのテールレイテンシを比較的低く保つために行われます。これは、変更操作がべき等性である場合にのみ安全に実行できます。
TimeSeries抽象化自体は、ミリ秒レベルのレイテンシーで時系列イベントデータを保存してクエリする、スケーラブルで高スループットのデータプラットフォームである。データを時系列レコードに整理し、時間によってイベントを分割し、定義された間隔でバケット化する。各イベントは不変で、タイムスタンプが押され、一意に識別されるため、正確な記録管理が可能で、効率的な時間範囲クエリをサポートする。現在、ピーク時には全世界の全データセットで毎秒約1,500万件のイベントを処理している。
NetflixにおけるTimeSeries抽象化のスループット(ソース)
耐久性のためのCassandraやインデックス作成のためのElasticsearchのようなストレージソリューションに支えられ、TimeSeries abstraction抽象化はグローバルな可用性と調整可能な一貫性を保証する。そのアーキテクチャは、動的なスケーリング、設定可能な保持ポリシー、適応的なクエリの最適化をサポートしており、Distributed Counter Abstractionのようなデータ集約型サービスの基盤となっている。
Netflixのエンジニアは現在、Accurate Global Counterの実験をしている。このカウンタータイプは、事前に集計されたカウントと最近のイベントのライブデルタ(最新の差分データ)を組み合わせることで、リアルタイムの集計を強化する。バックグラウンドのロールアップを待つ代わりに、最後の集計以降に未処理のイベントをスキャンすることで、最新のカウントを動的に計算する。これにより、読み込みの複雑さとリソースの使用量は増加するが、並列クエリーと動的バッチ処理により、レイテンシは低く保たれ、重要なメトリクスの精度をほぼリアルタイムに保つことができる。
実験的Accurate Global Counterのハイレベルな概要(ソース)