周期オークション
リアルタイムビディング——従来型アドテクのモデル——はインプレッションごとにオークションを走らせ、それぞれにページ読み込みが許す数ミリ秒を与えます。Promovolve はこれを逆転させます。オークションはインプレッションに先立って走り——ページが分類されたとき、周期ティックのとき、そして世界が変わったとき——結果はキャッシュされます。配信はキャッシュを読むだけです。誰も待っていないからこそ、オークションはじっくり考える余裕を持てるのです。
オークションが生み出すもの
サイトの AuctioneerEntity は、ページとスロットごとに、勝者ではなく候補プールを組み立てます。
- 需要の照会。 ページのカテゴリー(祖先展開込み)を
CategoryBidderEntityアクター——どのキャンペーンがどのカテゴリーに入札しているかの台帳——に対して解決します。CPM のしきい値が競争力のある入札だけを残し、各カテゴリーは CPM 上位およそ50キャンペーンまでしか出せません。 - 入札の収集。 資格のある各キャンペーンのエンティティに、クリエイティブと現在の入札額を尋ねます。キャンペーンはここで自分のフィルターを適用します——広告主が掲載先を制限していれば、サイト許可リストなど。
- 並べ替え、上限なし。 候補はクリエイティブ単位で重複排除され、CPM 順に並び(同点はパブリッシャー承認済みが勝ち)、各キャンペーンの最良クリエイティブが先頭に来るよう並べ替えられます。資格のあるキャンペーンのプール全体が保持されます——並べ替え時の足切りはありません。配信時の選択は学ぶために敗者を必要とします。敗者を捨てるオークションは、探索を音もなく無効化してしまうのです。
- キャッシュ。 プールは ServeIndex——クラスターの章で説明する、複製されたローカル読み取り可能なキャッシュ——に TTL 付きで書き込まれます。
パブリッシャーがまだ承認していないクリエイティブを持つキャンペーンも入札はします。それこそがクリエイティブが承認キューに届く仕組みだからです。しかし承認待ちの需要は配信できず、フロア最適化からも見えません——未承認の入札が市場に何かを教えてはならないのです。
オークションが走るとき
- 分類時 — ページの最初のオークションは、最初の分類の直後に続きます。
- タイマーで — すべてのサイトが新鮮なページを周期的に再評価します(本番は5分間隔。コードのデフォルトは30分)。タイマーは保険であり、仕事の大半は次のイベント駆動経路がこなします。
- イベントで、デバウンス付き — キャンペーンの作成・一時停止・ターゲット変更。クリエイティブの承認・拒否・フラグ。入札額の変更。フロアの移動。それぞれが、影響を受けるページの再評価を1秒のデバウンスでトリガーします。
- 起動時 — 再起動したオークショニアはサイトエンティティから分類を教え直され、即座に再オークションを蹴ります。クラスター再起動はタイマーを待たずに収束します。
予算切れは削除ではない
キャンペーンが日予算を使い切っても、その ServeIndex エントリーは削除されません——削除すればエントリーに付随するパブリッシャー承認ステータスまで捨てることになり、真夜中のたびに全クリエイティブを承認キューにやり直させてしまいます。代わりにエントリーの TTL は日付のロールオーバーを越えて更新され、配信経路が予算超過キャンペーンを選ばないだけです。ロールオーバーで予算がリセットされれば、クリエイティブは即座に復帰します。
同じ原則が、システム内のすべての退場判断を貫いています。削除イベントは意図的かつ限定的に(広告主の凍結。キャンペーンのサイト退出は読者のピンを道連れにする)。一時的な状態は、削除ではなく標識を立てる。過去の配信バグの大半は、まさにこの規則への違反にさかのぼれました。