WalmartLabsのエンジニアリングチームは「Expo」と呼ばれるリアルタイムのA/Bテストツールを開発した。それはユーザエンゲージメントメトリックを収集し分析する。受信したログデータを処理し、メトリックをKairosDBに保存するためにSpark Structured Streamingを使用する。
A/Bテストは、既存のバージョンと比較して、アプリ、Webサイト、アルゴリズムの変更がユーザの行動に与える影響を測定する。A/B実験での「バリエーション」は、ユーザに公開されるさまざまな種類のUI/アルゴリズムがある。本番稼働中のバージョンは「コントロール」と呼ばれる。WalmartLabのExpoでは、「これらのパターンの間でトラフィックを分割」し、ユーザエンゲージメントメトリックスを取得する。システムは、実験の実行中にメトリック内の異常な傾向と誤検知を検出できる。Expoは、Spark構造化ストリーミングジョブ、Kafka、KairosDB、Grafanaを使用して構築されている。これは、トラフィックが多いときにパフォーマンスの問題があった以前のLambdaベースのパイプラインに代わるものです。InfoQは、ツールの詳細を知るためにWalmartLabsのシニアソフトウェアエンジニアであるReza Esfandani氏に連絡した。
ExpoはKafkaクラスタに転送されるログ(サーバーログ、ビーコン)を処理することによって機能する。ログ内の各ユーザはセッションIDで識別される。Sparkでアプリとして、ジョブは1分ごとに実行され、構造化ストリーミングを使用してイベントをログに記録し、2段階でメトリクスを生成する。回復力のために、ジョブのコピーが別のデータセンターで実行される。ジョブは生成されたメトリックをKairosDBに書き込む。これは裏でCassandraが機能している時系列データベースである。システムはまた、Grafanaダッシュボードで使用されるKairosDBに独自のヘルスメトリックを追加している。Esfandani氏は、これが実行される規模について説明する。
ジョブの各インスタンスは現在180個のコアで実行されています。毎秒30k~60kのレートでデータを取得し、1分あたり100万~300万レコードのレートでCassandraにメトリックをプッシュしています。
Scalaで書かれたSparkジョブは、各ユーザの行動を「セッション」に集約する。Apache SparkやApache Flinkなどのストリーミングフレームワークを使用すると、開発者は時系列データの連続したストリームをウィンドウ内にグループ化して処理できる。時系列データは遅れて到着したり、順序が入れ替わる可能性があり、これらのフレームワークは、そのような場合に対処するための抽象化を提供する。Expoジョブの第2段階では、すべてのセッションにわたるメトリックが毎分集約されてKairosDBに保存される。これにより、その分におけるすべてのユーザのメトリック値が得られる。
画像提供:Reza Esfandani氏、許可を得て使用。
Esfandani氏は、Sparkは汎用フレームワークであるため、チームはセッション化のためにカスタムコードを記述しなければならなかったと言っている。さらに彼は、「WalmartLabsで開発したセッション化部分は、いくつかの修正を加えて、Spark上のセッション化のためのサードパーティライブラリとしてオープンソースにすることができる」と述べている。Expoでは、遅れたイベントを処理するために、Sparkのウォーターマーキング機能を使用している。Esfandani氏によると、エキスポのウォーターマークの値は10分である。つまり、イベントは最大10分遅れて処理されるいうことである。
Expoの各実験は、事前定義された測定ポイントを持つテナント(モバイルアプリ、Webサイト)IDを持って実行される。現在Walmart全体で8つのテナントをサポートしている。