F@N Ad-Tech Blog

株式会社ファンコミュニケーションズ nend・nex8のエンジニア・技術ブログ

広告配信がどのように作られているのか

はじめに

はじめまして。 関西の大学院に通う博士前期課程1年の馬越です。 株式会社ファンコミュニケーションズさんにて9月2日〜9月6日の間インターンシップに参加させていただきました。 今回、私が参加させていただいたコースはScalaを利用した広告配信システムの開発でした。 それでは参加経緯、インターンシップ内容、感想、ファンコミュニケーションズさんについて書いていきたいと思います。

参加経緯

ファンコミュニケーションズさんを知ったのはサポータズさんの1on1面談イベントにて 社員さんとお話しをさせていただいたのがきっかけとなります。 そこでの会話をきっかけに、広告配信システムがどのように作られ、配信されるのか非常に気になっていました。 また、夏休み期間中に新しいことに挑戦したいと思い、何か新しい言語を学べるインターンはないかとWantedlyさんのサイト眺めていた際に ファンコミュニケーションズさんのインターンシップではScalaを利用して広告配信の裏側を知ることができると目に入り、応募いたしました。 応募からすぐに返信をいただき数日後に面談をさせていただきました。

インターンシップ内容

今回インターンシップの内容は、Scalaを利用してミニDSPを構築しようということでした。 アドテク業界は主にSSPとDSPというのに分かれております。 SSP、DSPとはなんぞや?という方は以下のサイトを参考にしてみてください。

kigyotv.jp

今回のインターンでは、メディア(アプリ等)からリクエスト(アプリIDや広告枠を売りたい最低金額)等が送られ、 その情報をもとに、広告主が買いたい金額を予測し(今回は実装していない)、最適な広告を決定し、メディアに返す処理を実装しました。

1日目

午前中は社内見学とSSP、DSPの解説がありました。 午後からはメンターに指導をいただきながら、どう開発を進めていくか話し合いました。 また、私がScalaが初心者なため、Scalaの基本的事項をおさらいしました。 その後、ミニDSPを構築するためのアーキテクチャ選定を行いました。 ここから少し技術的な内容になります。

まず、使用言語はScalaです。 Scalaはオブジェクト指向と関数型言語の両方を兼ね備えております。 (慣れまで少し時間がかかりそうだと感じました。) IDEはIntelli J Communityを利用しました。

今回の開発はDSPの仕様からサーバとデータベースが必要となります。 また、SSPからDSPへのリクエストの応答時間が100msであることが必須条件となっているので そこを考慮しメンターに相談しながらアーキテクチャを選定していきました。 サーバはWebアプリケーションフレームワークであるFinatraを利用しました。

以下のサイトを参考にしました。 qiita.com

qiita.com

FinatraでWebアプリケーションの雛形を作って1日目は終了しました。

2日目

2日目からは主にAPIの実装に入りました。 APIにリクエストがきた場合の処理を実装しました。 今回はSSPからの情報を元に、最適な広告を返す処理として、

  • データベースから広告のデータを取得
  • メディア(アプリ等)ごとに表示する広告をフィルタリング
  • 機械学習にリクエストを送信し各広告の入札金額の取得
  • メディアからの希望入札金額に下回っている広告をフィルタリング
  • 一番高い広告を決定し、SSPに送信

という流れになっております。

ここで、受け入れ条件として応答時間が100msであることが必須のため、 データベースを作る際にsqlを毎回利用していると トラフィックが増えた際に仕様を満たせないため、Redisを利用することになりました。 Redisは以下のサイトを参考にしてください。

qiita.com

今回はScalaでRedisを利用したいため、scala-redisを利用しました。

github.com

サーバとRedisを繋ぐ時は、コネクションプールを利用し接続しています。

https://wa3.i-3-i.info/word12762.html

3日目

3日目は2日目の続きです。 サーバとRedisを接続できたので、実際に広告データ(ダミー)を取得しました。 そのデータを元に、フィルター処理を実装しました。 メンターに指導をいただき、fillter関数やMap関数を利用しScalaっぽい書き方で実装できました。 if文を利用せずに関数を実装できたのがとても感動しました。 次にサーバから機械学習APIにリクエストを送信し 返ってきた値をフィルタ処理し、SSPに返信しました。 ここまでで、ミニDSPのメインの機能を完成させることができました。 実際にcurl等でAPIにリクエストを送信すると実際にデータを返すことができました。

4日目

4日目はリクエストがきた際にログ保存を行う処理を実装しました。 Scalaで何かログを保存しやすいのはないかと調べると、logstash-logback-encoder というものを発見し、こちらを利用することにしました。

labs.septeni.co.jp

一通りシステムが完成したので、実際に応答時間を調べてみました。 今回はローカル環境なのであまり意味がありませんが、形だけどのくらいか調べました。 はじめはHttpieを使用してtime curlで応答時間を調べていましたが、300ms程度で かなり遅いことに悩まされました。 原因がHttpieであることを発見し、terminal等で確認すると100ms以内で実行できました。

また、Apace Benchを利用してWebサーバの負荷テストも実施してみました。 こちらもローカル環境なのであまり意味がありませんが、以下のサイトを参考にしました。

qiita.com

最後にメンターに自分の書いたソースコードのレビューをいただき、 コードのリファクタリングを行いました。 実装するために処理を長く書いてしまい見辛いコードになっていたのを 1クラス1機能に分類し、不要なコード等を除去しました。 フィードバックがあったことにより今後どのようにコードを書いていけば良いか理解することができました。

5日目

5日目は午前中は退職手続き等を済ませ、午後から成果発表を行いました。 発表が終わり、このブログを書いて終了です。

時間が余ったのでSSPを作成して自分のDSPにリクエスト送信することになりました。

感想

今回のインターンシップで広告配信の裏側を理解することができました。 アドテク業界ではユーザ、メディア(アプリ等)、広告主の関係があり、今回はメディアと広告主を繋ぐDSPを開発しました。 その中で、実際にアドテク業界が使っている技術などをメンターに教えていただき大変勉強になりました。 また、メンターにソースコードのレビューをしていただき、どのように書いたら綺麗になるのかを教えていただきました。 インターンシップを通して様々な技術と触れることができたので大変良かったです。 今回の開発を通して、ソースコードの書き方やオブジェクト指向の概念等曖昧な部分があったので、 今後はこの経験を活かして自分なりにスキルアップを目指したいと思います。 インターンシップに受け入れていただき、そして、5日間ご指導いただき本当にありがとうございました。

ファンコミュニケーションズさんについて

最後になりますがファンコミュニケーションズさんについて少し書きたいと思います。 インターンを始める前は、どのような雰囲気で開発されているのか全く想像がつきませんでした。 いざ、インターンシップに参加してみると社内全体がほんわかしていると感じました。 自社開発のため殺伐とした環境ではないためリラックスした状態で開発ができると実感しました。