BT

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

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Expedia、WebSocketとKafkaを使用してほぼリアルタイムのストリーミングデータをクエリする

Expedia、WebSocketとKafkaを使用してほぼリアルタイムのストリーミングデータをクエリする

Expediaは、同社のプラットフォームからのクリックストリームデータをほぼリアルタイムでクエリするソリューションを開発し、同社のプロダクトチームとエンジニアリングチームが、新しいデータ駆動型の機能使用事例に取り組んだり、既存のデータ駆動型の機能使用事例を強化したりしながら、ライブデータを探索できるようにした。チームは、WebSocket、Apache Kafka、PostgreSQLを組み合わせて使用し、クエリ結果をユーザーのブラウザに継続的にストリーミングできるようにした。

Expediaは、Webサイトのやり取りを含む多くの情報元から膨大な量のデータを生成している。ユーザーがWebサイトを閲覧したり、Webページ内の要素とやりとりしている間に収集されたクリックストリームデータは 、ユーザーの行動に関する貴重な情報を提供できる。Expedia Groupのデータエンジニア、Ryan Lacerna氏(現在はPersonioに在籍)は、ほぼリアルタイムで問い合わせすることのメリットを説明する。

データの品質を確保するためには、パイプラインに投入されたデータをすぐに確認することが課題の1つである。データレイクやデータウェアハウスへのクエリのような従来の方法では、処理に時間がかかる。しかし、[...] イベント ドリブン ツールを実装すると、[...] ユーザーはストリーミング・データを迅速かつ効率的にクエリおよび表示できるようになり、データ プロデューサーの行動を支援し、データ コンシューマーがどのようなデータがキャプチャされているかを理解するのに役立つ迅速なフィードバックが得られるようになる。

チームは、Webブラウザーとサーバー間の双方向リアルタイム通信にWebSocketを活用することを選択した。WebSocketを使う利点は、サーバーのデータを常に更新しなくて済むことだ。さらに、WebSocketは単一の長時間持続するTCPコネクションに基づいており、リソースのオーバーヘッドを最小限に抑えながらパフォーマンスを向上させる。

ニア・リアルタイム・クエリー・ソリューションのアーキテクチャ(出典:Expedia Engineering Blog)

このソリューションの構造には、UIアプリケーション、WebSocketハンドラ、Filter Workerが含まれ、Apache KafkaトピックとPostgreSQLデータベースを使用する。UIはシンプルなクエリフォームを提供し、ユーザーは表示するクリックストリームイベントのタイプと、WebSocket経由で送信されたクエリ結果を表示するウィジェットを指定できる。UIアプリはSockJSライブラリとSTOMPプロトコルを使用してサーバーとやりとりする。

サーバー側では、WebSocket HandlerサービスがSTOMPメッセージとして表現されたクエリを処理し、ブラウザにストリーミング結果を送り返す。Handlerは、Apache Kafkaトピックからフィルタリングされたクリックストリームイベントを消費する。Filter Workerは、アクティブなクエリに基づいてフィルタリングされたイベントのストリームを、WebSocket HandlerがサブスクライブしているKafkaトピックにパブリッシュする責任がある。どちらのサービスも、スケーラビリティを実現するためにKubernetesで複数のレプリカを使って実行される。

サービスは PostgreSQL データベースを使用して、クリックストリームイベントのフィルタリング基準を含むアクティブなクエリの詳細を同期する。WebSocket Handlerは、クエリフィルターをデータベーステーブルに永続化し、ユーザーがセッションを切断したり、ユーザーセッションが残っている場合にTTL(time-to-live)が切れたりすると、それらを削除する。この解決策は、PostgresのLISTEN/NOTIFY機能に依存して、Filter Workerがデータベースの変更に基づいてメモリ内キャッシュを最新に保つことを保証する。

フィルタリングされたイベントのユーザーへのルーティング(出典:Expedia Engineering Blog)

Filter Workerサービスは、フィルタリングされたトピックにパブリッシュされるイベントの数を、ソース・トピックに比べて大幅に減らす。フィルタリングされたトピックにパブリッシュされたメッセージは、フィルタIDでキー設定され、WebSocket Handlerによって正しいユーザーにメッセージをルーティングするために使用される。このアプローチはまた、ツールのユーザー数が増加するにつれて、負荷を処理するためにWebSocketレイヤーのスケーリングを可能にする。

作者について

この記事に星をつける

おすすめ度
スタイル

BT