Contents Delivery Managementという考え方

地震速報の話

Iさん:ヤフーの全ページに一気に反映させる仕組みってないかな?
yamaz:  広告サーバはどうですかね?設備はもうあるし、クリックや表示カウントもできますよ。

 


1秒間に数万アクセス――地震発生時にYahoo! JAPANトップに現れる“あの枠”の裏側 - Yahoo!ニュース スタッフブログ

 

当時ヤフーの全ページに一気にデータを反映させる仕組みは広告サーバしかなかったので、地震速報の実装は広告サーバをベースに行われた。もう10年ほど前の話だ。
 

Contents Delivery Managementという考え方

 
弊社はいわゆる広告システムを作っている会社だけど、広告システムを9年前に作ろうと思ったときに「広告システムって結局のところなんなのだろう?」というのを非常に考えた。いわゆる「バナー配信システム」を作ることはもちろんすぐできたけれど、今後ありとあらゆるインターネットの広告配信ニーズに応えようと思ったときに単なるバナー配信システムという作りではいつか行き詰まるだろうとも思っていた。
 
前の地震速報の実装を広告サーバベースで行った経験から、インターネットにおいて表示すべきコンテンツはマークアップ言語で全て記述できるので、結局のところ
 
その瞬間の状況に応じた最適なコンテンツ(= Markup Languageで記述された小さなテキスト片)を超柔軟かつ超高速に選択し、配信し、集計できる仕組み
 
こそが広告配信システムの本質だという考えに行き着いた。
 
なので広告システムを作るにあたっては、まず超汎用的なコンテンツ配信システム(Contents Delivery Management System)を構築し、その上の1アプリケーションとして汎用の広告システムを乗せるという構成を取ることにした。SSP/DSP/3PASなどは上記の考え方に沿うと広告システム上の1アプリにすぎないので、さらにその上に実装するという形を取った。
 
 
 f:id:yamaz:20150313193134p:plain
 
 
# 余談だけど弊社広告サービスの画像サーバの配信ホスト名である
# i.socdm.comはScaleOut Contents Delivery Managementの略
 

その瞬間の状況に応じた最適なコンテンツってなんだ?

 

さて「その瞬間の状況に応じた最適なコンテンツ」とはいったい何だろう?

 

1. 手元にあるコンテンツのうちで

2. その瞬間に出してOKなもののうち

3. その瞬間において一番優先度が高いもの

 

がその答えになる。コードだとこんな感じ

 

class ContentsDeliveryController < ApplicationController

   def lookup
      Contents.all.grep(:can_delivered?).max(:priority).to_html

   end

end

 

この考え方は比較的いろんなところに応用が利く。

 

1. インターネット全部のコンテンツを対象に、ワードに応じた結果を表示
2. あちこちの記事のうち、ユーザに応じて優先度が高い順番に表示
→キュレーションサービス
3. 各ランキングを順番に出す
→ランキングページ
 
また配信コントロールもいろいろできて
 
1. n回見せたら止める
2. ある日時を過ぎたら配信開始・停止
3. 特定の条件になったら配信
 
などは最も得意とするところで、いわゆるマイクロサービスと呼ばれるものもこの考え方に従って実装すれば比較的はかどると思う。
 

最後に絶賛エンジニア採用中

 
現在弊社の広告システムはContents Delivery Managementという考え方を元に実装されていて、月間数千億アクセスであってもいまのところうまくいってます。そんなシステム中身を見てみたい!俺がもっとすげーの作ってやるぜ!という方、是非弊社に応募ください。
 
採用情報 : ScaleOut
 
 
特に機械学習方面の応募をお待ちしておりますので、どうぞよろしくお願いいたします。
 
(おしまい)

あわせて読みたい

30分でわかる広告エンジンの作り方 from Daisuke Yamazaki