F@N Ad-Tech Blog

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

ファンコミュニケーションズのインターンに参加しました!

はじめまして!京都で技術補佐員をやっている林と申します(秋から院生になります笑)。
今回は、9月9日~13日の1週間で、ファンコミュニケーションズで「広告配信システム(DSP)の構築」というインターンに参加させていただきました。このブログでは、インターンの参加までの流れから、インターンの内容や感想について書いていこうと思います。

インターン参加まで

この会社を知るきっかけにもなったのがサポーターズという会社が行なっている1 on 1 面談イベントでした。1番最初に面談をしてもらえたことがかなり記憶に残っています。このサポーターズでのイベントをきっかけに「そもそもアドテクって何?」「広告配信の裏側を知りたい!」と思い、このインターンに応募しました。オンライン面接での選考が行われました。
一度インターン参加確定になったのですが、私的な諸々の都合で日程をずらしていただき、9月9日から無事に参加させていただけることになりました。

前日から東京で宿泊していました。インターン中の宿泊先は外苑前という駅にあるホテル(神宮球場の目の前)だったのですが、そこが大変綺麗だったので、前日から一人でテンションが上がっていました笑。

インターンの内容

インターンの内容は、PHPを使ってminiDSPを構築する、という内容でした。最初は、「DSP???」という感じでしたが、初日に広告配信の仕組みを解説してもらい大枠を理解することが出来ました。気になる方は、「DSP SSP」とかでググると良い記事が沢山出ると思います。

具体的には、 SSPからのリクエスト(「Aというメディアが広告欲しがってるよ」、SSP)に対し、そのメディアの広告枠を買う金額を予測し(ここは対象外、ML)、最適な広告を決定して返す(「私たちはこの広告をこの値段で出すのが良いと思います」、DSP)という処理を実装しました。

初日

深夜に台風が関東を直撃した日だったので、会社には出社出来た数人しかいませんでした(運良く地下鉄は動いてた)。午前中は、書類の手続きと社内見学、SSP・DSPの説明、PCのセットアップ等がありました。
ランチは、入社して数年目の若手社員の方々と食べました。
午後は、メンターの人とオンラインで挨拶をした後(電車が動かなかったらしい)、仕様の説明や技術選定、開発のスケジュール等を話し合い、実際に開発に取り組んでいきました。

言語はPHPだったので素のPHPでも良いかなと思ったのですが、とりあえずAPIを光速で作りたいなと思ったので、自分が慣れているLaravelというフレームワークを使用しました。

その他、選定したものは以下になります。

  • PHP (Laravel, Lumen, Slim4)
  • Mysql 8
  • Redis × 2
  • Nginx
  • Fluentd

これらを全てDockerにのせ、Docker-Composeで立ち上げられるようにしました。
その後、今回のAPI作成で関わるモデルのDB設計をして、実際にAPI作成の途中までを行いました。

Docker化には以下の参考サイトが非常に役立ちました!
qiita.com

2日目

2日目はひたすらAPIを作っていきました。リクエスト毎にMysqlに接続するのは無駄な処理なので、Predisを使ってRedisにキャッシュさせるようにしました。

また、DSPサーバーからMLサーバーへリクエストをする必要があるので、Guzzleを使用してリクエストを送るようにしました。しかしながら、MLサーバーを立ててないことに気づいたので、Slim4という軽量のフレームワークを使って簡易的に立てました。(Laravelばっかりでもね・・・)

メディアタイプや金額でフィルタリングをする必要があるのですが、それはLaravelで使われているCollectionクラスで実装しました。

インターンの課題に含まれていた、イベントに対してログを出すという仕様も実装しました。(Laravelは便利!)

結果として、2日目で仕様に書かれていたAPIやログは一応全て実装できました!!

3日目

コントローラーに処理を殴り書きしていたので、関数に切り出す作業を行いました。

また、運用を考え、1つのRedisで書き込みと読み込みを行うのは負荷が高くなるので、書き込み用のRedisと読み込み用のRedisに分けることにしました。(世に言うmaster-slave構成です)

3日目のお昼は社内で食事をしましたが、昼以降はとあるイベントのため帰宅となりました。

(3日目の午後は、私は渋谷に行ってカラオケと本屋で楽しんでました笑)

4日目

4日目は、Redisのmaster-slave構成を終わらせ、AWS上でメンターに用意してもらったSSPとの連携を行いました。

その後に、速度計測をすると想定よりも遅かったので、速度改善にシフトしていきました。
具体的に行ったことは、不要な処理を削除し出来るだけデータ操作回数を減らしたのと、Slim4をLumenというフレームワークに変えたことです。

これとは別に、ログをFluentdで集約するように設定しました。

最終日

仕様を満たしていない箇所があったので(ログにmsecを残す部分)、そこを修正しました。AWS上で動いているかを最終確認し、発表のためのスライドを作成していました。

発表には多くの社員さんが来ていただき、無事に終えることが出来ました。

その後は、このブログ記事を書いて終わりです・・・。(あっという間でした)

感想

広告全体の仕組みやその裏側の仕組み等、アドテクの基礎が理解出来るようになったと思います。実際の技術や仕組み等も見ることができ、自分でもminiDSPを作ることが出来たのは大きな収穫だったなと思います。また、インターンを通して、自分が慣れている技術(Laravel)だけでなく、慣れていない部分(Docker, Redis, Lumen)にも触れられたので大変良かったです。

会社自体で言うと、とてもフレキシブルな会社だなと思いました。リモートで作業している社員さんが多いだけでなく、出勤・退勤時間も裁量労働制なのでかなり自由です。自分に合った働き方が出来る会社で素晴らしいなと思いました。

メンターさんについてですが、かなり優しく接して頂いたという印象です。技術的なことからサービス的なことまで、色んな質問に答えていただき非常に勉強になりました。

まとめ

インターンに行くことで会社の中の雰囲気を感じ取ることが出来て非常に良かったと思います。
また、アドテク自体への興味もかなり深まったので、個人的には最高に良かったインターンだと思いました。

短い間でしたが、インターンに受け入れていただき、また多くのサポートをしていただき、本当にありがとうございました!