iQONの広告配信システム

「iQON AD」

VASILYでは2014年10月から、インフィード型ネイティブ広告「iQON AD」をiQONのiOSAndroidアプリ、スマートフォンサイトに向けて配信しています。

「iQON AD」は、iQON内に配置された独自広告ユニットに対して広告を配信できるサービスになります。本プロジェクトでの開発要素は主に以下の3つです。

  1. 1. ネイティブアプリ内の広告ユニット(SDK)
  2. 2. 広告管理ツール
  3. 3. アドサーバー

サービスインしてから少し間があいてしまいましたが、広告配信システムについて簡単に紹介したいと思います。

「iQON AD」のシステム構成

iQON ADシステム構成

広告管理ツールとアドサーバーはともにRubyで書いており、ミドルウェアも含めてすべてAWS上で運用しています。

広告管理ツール

広告の入稿、レポートの閲覧、配信データの生成と配信ログを使った集計などを行います。社内外の限られたユーザーが利用するシステムです。

Ruby2.0 + Rails4.0で書いています。

ツールから入稿される広告データはRDS(MySQL5.6)に貯めて、広告配信に必要な形に変換してRedisへと同期します。アドサーバーからS3に蓄積される各種計測ログを定期的に集計して、これもRDSに貯めます。広告の画像はS3にあげて、CloudFrontから配信しています。

アドサーバー

主に広告配信と各種イベントの計測を担当します。HTTPリクエストに対してJSONを返すWebAPIです。

コアとなるEC2インスタンスではSinatraベースのWebアプリケーションをunicornに載せ、unixドメインソケットでnginxとつないでいます。広告データはRedisから取得し、各種計測イベントは同じインスタンス内にあるfluentdを経由して集約用のfluentdからS3に蓄積。memcachedには消えてもクリティカルにはならないもの(かつ配信には必要なもの)を入れています。アドサーバーでは基本的に静的コンテンツ配信は行っていません。

配信ロジックを最適化しつつ高いスループットを確保することが要件であるため、Railsのような高機能はフレームワークは使わずRuby2.0 + Sinatra1.4で書いています。

アドサーバーの処理性能

ピークタイムでサーバー1台あたり30リクエスト/秒くらいの広告リクエストを受けていて、それを平均30~40msec程度で処理しています。 各種計測イベントなども受け付けるので、それも含めると実際にはもう少し多いリクエストを処理することになります。

広告配信の規模としても(一般的なアドネットワーク等と比べると)それほど大きいわけではないので、今のところ必要十分な性能となっています。

Ruby2.0?

現在のRubyの最新版は2.2なのに2.0を使っている理由はいくつかありますが、時間的制約が主な理由です。

プロジェクトの初期開発期間が非常に限られていたため、既存プロジェクトで運用実績のあるものを使うことでインフラ構築コストや未経験による運用リスクは最小限に抑えつつ、時間の大半をアプリケーション開発に最大限あてることでひと通りの機能を揃えることを優先しました。(VASILYではインフラ構築にはAMI+Chefを使っています)

Rubyのコードについてもあまり凝ったことはせずにわりと愚直に書いてあります。そのため、設計やパフォーマンスにもまだまだ改善の余地はあります。Ruby2.1以後GCまわりの改善によってパフォーマンスを改善できそうですし、今後はRubyバージョンアップも含めて色々と改善を図っていく予定です。何かしら成果があった時にはまた本ブログで紹介したいと思います。

以上、iQONの広告配信システム構築の紹介でした。

VASILYでは、広告配信システム開発だけに限らずエンジニアを募集しています。
https://www.wantedly.com/projects/7595
連絡先:info[at]vasily.jp