Netflixのエンジニアは最近、どのようにStudio Searchの構築したかを公開した。そこでは、Apache Kafkaストリーム、Apache Flinkベースのデータメッシュプロセス、Elasticsearchシンクを使ってインデックスが管理される。彼らは、NetflixのフェデレーションGraphQLグラフの要素を抽出し、それを検索可能にするプラットフォームを設計した。現在、Studio Searchでは、組織内の多くのアプリケーションのユーザエクスペリエンスに関して重要な部分が強化されている。
Netflixのコンテンツエンジニアリングでは、各チームが独自にドメイングラフサービス(DGS)を構築・運用している。そして、同時に、フェデレーションゲートウェイによって公開される統合GraphQLスキーマでドメインを他のドメインに接続する。この構造を前提として、NetflixのエンジニアのAlex Hutter氏、Falguni Jhaveri氏、Senthil Sayeebaba氏は、Studio Searchの動機について次のように説明している。
エンティティ[...]がグラフで利用できるようになると、関連するエンティティの属性に基づいてクエリを実行し、エンティティを特定することが一般的になるでしょう。例えば「Ryan Reynolds氏が俳優として参加する現在撮影中のすべての映画をください」というクエリです。
ユーザが検索対象とするグラフ内で、リンクしているエンティティの例
出典: https://netflixtechblog.com/how-netflix-content-engineering-makes-a-federated-graph-searchable-5c0c1c7d7eaf
著者によると、フェデレーショングラフアーキテクチャでは、各サービスが「エンドポイントを提供し、そのエンドポイントが、そのサービスで所有していないデータに適用されるクエリとフィルターを受け入れる必要がある」。そして、それを使って、返すべき適切なエンティティを特定する必要がある。悪いことに「サービスを所有するすべてのエンティティがこの処理を行う必要がある」。フェデレーショングラフを検索できるようにする上で、この共通の問題がStudio Searchの作成につながった。
Studio Searchのインデックス作成アーキテクチャ
出典: https://netflixtechblog.com/how-netflix-content-engineering-makes-a-federated-graph-searchable-5c0c1c7d7eaf
上の図は、Studio Searchのアーキテクチャと、どのようにしてフェデレーショングラフの要素に対するインデックスを維持するかを示している。アプリケーションイベントとChange Data Capture(CDC)イベントは、スキーマ化されたKafkaストリームにストリーミングされる。Apache Flinkのデータメッシュプロセスではこういったイベントが消費され、フェデレーションゲートウェイに対してユーザが提供するGraphQLクエリを使ってデータが強化される。フェッチされたドキュメントは別のスキーマ化されたKafkaトピックに配置される。そしてその後、Data MeshでElasticsearchシンクによって処理され、Elasticsearchにインデックス付けされる。
チームは早い段階から手作業で統合を行っていた。しかし、Studio Searchとの統合のリクエストで没となったため、これは広がらなかった。「パイプラインのプロビジョニングを可能な限り自動化できるツールを構築する必要があった。」
自動化するために、チームは1つのYAML設定ファイルを定義した。このファイルによって、ユーザがパイプラインに関する高レベルの説明を記述できるようになる。次に、この設定を使って、データメッシュにインデックスパイプラインをプログラムで作成する。
サンプルの.yaml設定
出典: https://netflixtechblog.com/how-netflix-content-engineering-makes-a-federated-graph-searchable-5c0c1c7d7eaf
チームは、設定ファイルのGraphQLクエリテンプレートから、スキーマ化されたKafkaストリームに必要なApache Avroスキーマと、Elasticsearchに必要なインデックステンプレートを生成する。最後に、Pythonベースのコマンドラインインターフェイス(CLI)ツールを介してセルフサービスによるデプロイができる。
チームが現在直面している課題は、新しいインデックスをどのようにブートストラップするかである。そして、その際に、システムに過負荷をかけず、逆引き参照の使用を改善し、古いデータや欠落データに対するインデックスの一貫性と耐性を改善することが必要である。