BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース QCon New York 2017: Netflixのダウンロード処理におけるイベントソーシングのスケールアップ

QCon New York 2017: Netflixのダウンロード処理におけるイベントソーシングのスケールアップ

原文(投稿日:2017/08/23)へのリンク

NetflixのシニアソフトウェアエンジニアであるPhillipa Avery氏とRobert Reta氏が、QCon New York 2017で、Cassandraをベースとしたイベントソーシングアーキテクチャについて発表した。現在、それはNetflixのダウンロード機能を支えると同時に、同社サービスの柔軟性と信頼性、スケーラビリティ、デバッグ性の向上に一役買う存在になっている。

新たなダウンロード機能の大きな課題はステート(state)だった、とAvery氏は説明した。ステートレスなライセンスプロセスを持つオンラインコンテントとは違って、ダウンロードされたコンテンツにさまざまなビジネスルールを適用するためには、コンテンツを追跡する必要がある。ライセンスの継続期間、ダウンロード可能なデバイス数などがその例だ。

ステートについて理解するためにAvery氏は、Netflixがイベントソーシングアーキテクチャの採用を決定した経緯について説明した。

“イベントソーシングを使うことで、ユーザの運用中に起きたすべての状態変移を記録した、変更不能なトランザクション履歴を入手することが可能になります。”

イベントソーシングでは、ドメインモデルは集約(aggregates)に分割され、その集約それぞれが現在の状態を生成するイベントに分解することができる、とReta氏は説明した。重要なのは、永続化されるのが集約それ自体ではなくイベントのみである、という点だ。

Reta氏はイベントソーシングアーキテクチャを構成する主要な構成要素として、次の3つを概説した。

イベントストア(Event Store): 通常はデータベースで、指定された行IDに対してイベントのリストを返す。取得したイベントを再生することによって、集約を現在の状態にすることができる。
集約リポジトリ(Aggregate Repository): クエリを受け取り、それをイベントストアからイベントを取得するステートメントに変換するもの。生成された空の集約にイベントが順次適用されることによって、所定のステートとなる。
集約サービス(Aggregate Service): ドメインモデルのみを扱う抽象化。クライアントからの要求を受け取り、ビジネスルールを適用し、下位のリポジトリを呼び出す。

実装においてNetflixは、イベントストアにCassandraを選択した。これは主に、その強力なスケーラビリティとパフォーマンスという特徴によるものだ。スナップショットも実装した。これによって集約に対してすべてのイベントを再生しなくても、ステートの最新のスナップショットをロードした上で、そのスナップショット以降に到着したイベントだけを再生すればよくなった。さらに、Javaで記述されたオープンソースのシリアライズライブラリであるKryoフレームワークも導入して、バージョニングなどの機能に利用している。

Reta氏はさらに、新しいダウンロード権をエンドツーエンドで計算する方法についても詳しく説明した。最初にクライアントが、顧客IDとタイトルIDをダウンロードサービスに渡す。これによって空のダウンロード集約が初期化され、対応するイベントをその上で再生することによって適切なステートにする。最後に、サービスがビジネスルールを適用して、そのユーザがダウンロード制限に達しているかどうかを確認する。

Avery氏はイベントソーシングアーキテクチャに関する自身の経験を、4つの重要点にまとめている。

柔軟性(Flexibility): 新たなビジネス要件のために新しいドメインモデルが必要な場合、エンドツーエンドで簡単に実装することができる。データベースを完全に抽象化できるというメリットもある。
デバッグ(Debugging): システムで発生したすべての情報を表示する上で、有効な監査情報をイベントが提供することによって、問題の調査が簡単になった。
信頼性(Reliability): アーキテクチャ上の障害点は、Cassandraとサービスの2つである。ユーザエクスペリエンスを常に優先するために、何かがダウンした場合には、適切なデフォルト値が返される。この例では、ダウンロードサービスが機能しない場合には、ユーザがコンテンツを常時ダウンロード可能になるように設定されている。
スケーラビリティ(Scalability): Cassandraによって、アプリケーションのスケールアップが容易になった。唯一の問題はディスク容量だった。イベント量が多いためだ。しかしながら、スナップショットを実装することによって、それ以前のイベントを大規模で低速なディスクに保持する必要がなくなったと同時に、ユーザ要求への対応時にロードする必要もなくなった。

実装に関する詳細などの追加情報を含む講演の全体は、オンラインで見ることができる。
 

 
 

この記事を評価

採用ステージ
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

BT