広告レポートとビッダーのログが食い違う理由は、二つのうちのどちらかだ:イベントがレポートに届く途中で失われているか、双方が別々のルールで数えているか。オークション ID による1回の再集計で、どちらなのかがわかる。その答えで、パイプラインを直すか、マネージドサービスに移るか、作り直すかが決まる。
広告レポートがいつまでもビッダーのログと合わないとき、同じ差の裏には二つの問題が潜んでいることがある。イベントと呼ばれるインプレッションやクリックの記録が、多くはトラフィックのピーク時に、レポートへ届く途中で失われているか、双方がそれぞれのルールで数えているかだ。オークション ID、つまりエクスチェンジが各オークションに付けるコードによる再集計で、二つを見分けられる。誰かに依頼する前に、これを行う。新しいパイプラインだけで直るのは、一つ目の問題だけだからだ。
短い答え:ビッダーが落札したオークションとレポートのインプレッションをオークション ID で突き合わせ、件数を1時間ごとに比べる。1日後にもう一度数える。依然として見つからない落札の割合が最も混雑した時間帯に上がるなら、パイプラインはイベントを失っており、その修正にはエンジニアリングの作業が必要になる。イベントは揃っているのに、別の時間帯に入っている、二重に現れる、あるいはフィルタで除外されているなら、双方の数え方が違う。その場合の解決策は、双方に共通する、書面にした一組の集計ルールである。
あわせて読みたい
ビッダーのログには、ビッダーが参加したすべてのオークション、行ったすべての入札、落札したすべてのオークションが記録されている。レポートは、ブラウザやアプリからのインプレッションやクリックのように、あとから届くイベントをもとに作られる。両者の差の原因は二つのうちのどちらか、あるいは両方だ:
どちらにしても、この差は損失につながる。自社のレポートをもとに広告主へ請求しているなら、失われたインプレッションの分は少なく、二重に数えたインプレッションの分は多く請求することになる。一方で、各エクスチェンジはたいてい自分の集計にもとづいて請求してくる。これらのイベントから学習するビッダーも、誤った数字をもとに入札額を決めることになる。
双方をイベントごとに突き合わせる。IAB Tech Lab のリアルタイムビディング用プロトコルである OpenRTB では、各オークションにエクスチェンジが割り当てる入札リクエスト ID が付き、リクエストの中の各インプレッションにもそれぞれ独自の ID が付く。ビッダーは、落札時にエクスチェンジが送る通知と広告そのものに、これらの ID を書き込むようエクスチェンジに求めることができる。そうすれば、各インプレッションのイベントに、ビッダーのログと同じ ID が含まれるようになる。
どちらの ID も、それだけでは足りない。OpenRTB 2.6 では、リクエスト ID は各エクスチェンジが独自に決めるので、二つのエクスチェンジが同じ ID を使うことを妨げるものはない。インプレッション ID が一意なのは自分のリクエストの内側だけで、たいていは 1 から始まる。だから、エクスチェンジ、リクエスト ID、インプレッション ID の三つの値を組み合わせて突き合わせる。
そのうえで再集計を行う:
イベントにオークション ID が含まれていないなら、それを加えることが最初の修正になる。ID がなければ、再集計で比べられるのは合計だけだからだ。タイムスタンプと遅れて届くイベントについては、上でリンクした広告計測の技術記事が詳しく扱っている。
Kafka と ClickHouse で作ったパイプラインを例に取る。コレクタがブラウザやアプリから各イベントを受け取り、メッセージキューである Kafka に書き込む。ローダが Kafka から読み出し、レポートを支える分析用データベースである ClickHouse にイベントをバッチで書き込む。ピーク時には、どの段階でもイベントが消えうる:
問題が起きた日の最も混雑した1時間について、次の記録をエンジニアに出してもらう:
いちばん役に立つのは最後の記録だ。ピーク時に、ある段階の件数が落ちる一方で、その一つ前の段階の件数が保たれているなら、イベントはその二つの段階のあいだで消えている。
現在のパイプラインを直す:
Kafka なら Amazon MSK、ClickHouse なら ClickHouse Cloud のように、プロバイダーがサーバーを運用するマネージドサービスに移る:
パイプラインを作り直す:
この仕事を手がける会社には二種類あり、この記事はどちらも順位付けしない。アドテクのエンジニアリング会社は、ビッダー、エクスチェンジ、アドサーバーを構築しているので、オークション ID がどこから来るかを知っている。ただし、自社と同じ規模のイベントパイプラインを運用したことがあるかは尋ねる。データエンジニアリング会社は、多くの業界向けにイベントパイプラインを構築しているが、アドテク向けとは限らない。OpenRTB を扱ったことがあるか、エクスチェンジと件数を突き合わせたことがあるかを尋ねる。
候補リストのすべての会社に、同じ五つの質問をする。
重複をどう取り除くのか。期待すべき答えは、オークション ID とイベントの種類から作る ID を、どのリトライよりも前、イベントが生成された時点で各イベントに付ける、というものだ。パイプラインは重複を2回取り除く。イベントを保存するときに1回、レポートがそれを読むときにもう1回だ。2回目が重要なのは、ClickHouse がバックグラウンドで、予定の立てられないタイミングで重複を取り除くからだ。そのドキュメントは、この処理は「重複がないことを保証しない」と述べている。
遅れて届くイベントをどう扱うのか。期待すべき答えは、イベントの種類ごとに数字がまだ変わりうる期間が決まっていて、それを過ぎると数字が確定する時点がある、というものだ。それより遅れて届いたイベントも、捨てずに数え、遅延の印を付けるべきである。
自社のビッダーのログやパートナーのレポートと、数字をどう照らし合わせるのか。期待すべき答えは、オークション ID による毎日の再集計と、差ごとに書面で示す理由だ。差がどれだけの大きさになったら誰かがエクスチェンジに問題を提起するのかも、取り決めておく。
自社のピークを超える負荷でどうテストするのか。記録しておいた混雑した1日を、最も混雑した1時間より高いレートで再生してもらう。再生の途中で、コレクタを1台とデータベースサーバーを1台止めてもらう。終わったあと、すべてのイベントが、保存されているか、破棄されたものとして数えられているかのどちらかでなければならない。
コードは誰が所有するのか。自社であり、そのことを書面で定め、コードは初日から自社のリポジトリに置く。会社が手元に残すものは名前で列挙し、作業が終わったあとも使い、変更できるライセンスを付けるべきだ。
AdTech の分野では、amBrain は DSP 開発、リアルタイムビディングのプラットフォーム、アドエクスチェンジのエンジニアリングに取り組んでいる。その仕事には、amBrain がある顧客のために構築したデマンドサイドプラットフォームである RTBBidder も含まれる。
amBrain は、トレーディングとアドテクの遅いシステムを診断する。稼働中のプラットフォームをエンドツーエンドで計測し、時間がどこで費やされているかをレポートで特定する。
amBrain は2019年からソフトウェアを作っている。働き方には三つの形態がある:フルデリバリー、専任チーム、あるいはあなたのチームに入るエンジニア。顧客は、amBrain の再利用可能なコンポーネントを除き、プロダクトとコードの完全な所有権を保持する。
この記事は事例紹介ではない。どの顧客のイベントパイプラインについても述べておらず、RTBBidder は amBrain が構築した DSP として名前を挙げているだけだ。Kafka と ClickHouse はここでは例として挙げた技術スタックであり、amBrain のプロジェクトや amBrain が使うツールを説明するものではない。価格や期間も示さない。
レポートとビッダーのログが食い違っているなら、まず再集計を行う。そのうえで、その結果と同じ五つの質問を、amBrain を含め、候補リストのすべての会社に持ち込む。
現在のアーキテクチャと気になっている障害シナリオをお持ちください。30 分で一緒に確認します。