こんにちは、関西の大学に通う岡 恭平です。
この度、8月5日〜9日の5日間に渡ってログリーの夏季インターンシップに参加させていただきました。
この記事では、インターン期間中に取り組んだこと、参加してみた感想をまとめています。
ログリーでのインターンに興味がある方の参考になれば幸いです。
課題の概要
このインターン期間中で行われた課題は、「配信システムのチューニング」 でした。Web 広告を扱うアドテク企業では、もっとも最適な広告をいかに早く見つけ出し、結果を返すことが求められます。
今回の課題は、この状況に似せたサンプルの広告配信システムを高速化するということでした。また、チューニングに際して、次のような制約がありました。
- 新たなEC2インスタンスを増やすことや、既存のメモリやCPUの増設は禁止
- DBデータの更新時に、その配信結果が即時反映される必要はない
課題を解決するにあたって行ったこと
今回、インターンの課題を解決するにあたり、mysql slow queryを利用して、どの処理にもっとも負荷がかかっているかを探し出すことから始めました。その結果、
SELECT ad_response from [テーブルA] A JOIN [テーブルB] B ON A.id=B.a_id JOIN [テーブルC] C ON B.id=C.c_id WHERE (Aの特定のインデックスへの制約条件) AND (Bの特定インデックスの制約条件) GROUP BY (Aの特定のインデックス) ORDER BY (計算処理)
上述の部分の処理にもっとも負荷がかかっていることが判明したため、テーブルA, Bそれぞれの特定のカラムに対してインデックスをつけることにしました。
その結果、1リクエストあたりのレスポンスタイムが、3秒台後半から2秒台前半へと改善されました。
次に、ログリーや他の広告配信システムの設計を参考にし、与えられたアプリケーションアーキテクチャを大幅に変更することにしました。
具体的な内容はネタバレになるので詳しくは書けないのですが、これにより1リクエストあたりのレスポンスタイムが2秒台前半から300ミリ秒台にまで改善することができました。
この他にも、Golangの正規表現処理に時間がかかっていることに着目し、下方一致で検索をかけるなど、さまざまな改善施策を試みました。
この5日間の取り組みを通じて、課題に対して大きな改善を実現することができました。
一方で、実際の現場で利用されるシステムでは、1リクエストに対しておよそ100ミリ秒のレスポンスタイムが求められているため、今回の実装ではまだ不十分であったと考えています。最適化するためには、より多くの技術を知っておく必要があると感じました。
ログリーの環境について
- インターンに参加したメンバー
- 同期間中にインターンとして参加していたのは、私以外に修士1年の方がいました。彼が参加した理由としては、企業研究中にログリーが発表した特許技術について興味を持ち、参加を決意したとのことです。
- 昼休み
- ログリーの社員の方々と一緒にランチに行きました。その際、いろいろな方とコミュニケーションができるように、ランダムに社員の方を選んでいただき、エンジニアだけではなく、新卒や営業の方々ともランチをとることができました。
- 休憩、福利厚生
- ブレイクタイムになると社内のカフェエリアでエンジニアの方が豆から挽いたコーヒーを淹れてくださいます。コーヒーを飲みながら他のインターン生と技術的な話題で盛り上がりました。とりわけ、LispやOCamlといったマイナー言語の話題で盛り上がったことことが印象深い思い出です。
- インターンへ参加するにあたり、交通費や宿泊費は全額会社負担いただけるということで、関西からでも安心して東京へ行くことができました。また、毎週水曜日に提供される無料のお菓子が非常にありがたかったです。
感想
私にとって、バックエンドの知識が全く無い中で行われた今回の課題は非常に難しいものでしたが、多くの知識を得ることができた素晴らしいインターンだったと思います。バックエンドの技術に触れたことが一度もない人でも気軽に参加できるインターンだと思いますので、ぜひ参加してみてはいかがでしょうか。
メンターからのコメント
岡さん、1週間に渡るインターンお疲れ様でした!
最初はDBやサーバサイドの経験があまりないということだったので少し心配していたのですが、インターン前半であっという間にキャッチアップし、課題のアプリケーションを大幅にスピードアップできたのはとてもすばらしかったです!
自分の学生時代に比べ圧倒的に優秀なので、これからもこの調子でいろいろな経験をしてエンジニアとして成長されることを願っています。
そして、もしよければログリーも就職先の候補に入れてくれると嬉しいです(笑)。