DeNAの短期インターン参加してきました報告
お久しぶりです。
すぐ影響される大学生です。最近は財宝って呼ばれてるのでそう呼んでもらえると嬉しいです!
9/3~9/5に開催されたDeNA Summer Internship 2022 【短期】ソフトウェアエンジニアリングコースに参加してきたのでそのことについて書いていきたいと思います。
インターン開始前
インターンが始まる何日前だったかな...DeNAさんから素敵なプレゼントが届きました。
飲食物以外にもマグカップなど素敵なものをいただいたのですが最初にこのカロリーメイトたちを見たときに
「あーきっと寝れないインターンなんだろうなぁ...エナドリ買っとかないと」
と思ってしまいましたw
実際は開発時間がしっかりと決められていたので寝ることが出来ましたw
インターンでは、AWSを使うのですがAWSのハンズオンなどがあってAWSを触ったことがない人でも知識のキャッチアップをすることができる機会を提供してくださいました。(学生だとAWSなんて触る機会少ないですからね...自分は適当に使っていたら気づかないうちに課金額が...げふんげふん)
インターン期間中
初日に自分達がチャットアプリを改善する理由について説明されました。
ざっくり説明すると怪獣が攻めてきて大変なことになったから安否確認するためにチャットアプリを使いたい。おっと〜なんという偶然かここに社員が過去作成したチャットアプリがあるではないですかぁ。しかし、アプリを提供するために多くの課題が残されている。皆さんの力で最高のアプリに改善してください!
みたいな感じですね。
また、10000発言/秒 10万人同時接続に耐えられるようにするという条件がありました。
ヒエー
やったこと
- 問題点の洗い出しとタスク設定
- 目標設定
私たちのチームでは、コードを見て具体的にどこが問題そうか洗い出してタスクとして設定していきました。
順番は逆になってしまったのですがその後に目標を決めました。
私たちは「安否確認用のサービスなのに繋がらないなんてやばいよね...」ということで絶対に繋がるアプリケーションを目指すを目標として設定しました。
そのため、新規機能やUI/UXの改善よりもパフォーマンスチューニングに力を入れました。
具体的に行ったこととしては以下のものになります。
- N+1解消&SQLのクエリチューニング&index貼る
- limit, offsetペタペタ
- スロークエリの解析
- SQLを実行計画を見ながらチューニング
- BASE64で管理されている画像のS3化
- バルクインサートを実装
- DBサーバー1台,APPサーバー8台にスケールアウト
自分が担当したものは、主に BASE64で管理されている画像のS3化、バルクインサートを実装の二つでした。
BASE64で管理されている画像のS3化
DBを覗いてみると170万枚ほどの画像がbase64で保存されていてサーバに負荷を与えている状態でした。そのため、画像をs3に移行するというタスクを担当したのですが、処理を書いて実行してみると一晩で5万枚しか移行できておらずこのままでは終わらないということで他の方が裏技で対応策を実装してくれました。(本当にごめんちゃい)
バルクインサート
バルクインサートについては、10000発言/秒 10万人同時接続ということで1秒間に10000回もインサートなんてできないよ!
てなわけでgoroutine とチャネルを使って200msecまたは1000件メッセージが溜まったらバルクインサートするという処理を書きました。
結果
悔しくも自分達のチームは賞を取ることができませんでした。他のチームは、新規機能の実装を行っていましたが自分達は着手することが出来ませんでした。また、UI/UX面も触れていてユーザ目線でこのサービスに求められている本質的な部分について考え修正していてすごかったです。
反省はあげればキリはないのですが自分達のチームの成果物も負荷改善がかなり出来ていたので自信をモテる内容でした。