internship先日株式会社サイバーエージェントの2dayインターン、アドテクチャレンジに参加させて頂きました。今記事では、優勝に至るまでの技術的苦悩をまとめていきます。IDFAなどのデータが3時間程度大量に送られてくる(2000QPS)。1リクエストにつき100ms以内に返さないと無効になる。送られてきたデータを元に問題を解答し、その精度を元に得点がつけられる。以下の2つの形式でそれぞれ何問か答える【バッチ問題】データ送信が完了した後に問題に答えるex)○時から○時の間に〇〇から半径10km以内にいた人数は?【リアルタイム問題】データ送信中に、特定IDFA(端末ごとのID的なやつ)と時間がjsonで送られてくる。そのユーザーがその時間にどこにいたか等を答える。1000ms以内に返さないと無効。アーキテクチャ最初の案リアルタイム問題はレスポンスタイム制限があるため、直近で使うデータだけredisに置いておかないと💦と思っていたのですが、1000msは余裕すぎました。直近で使うデータなんか分からないから却下。二番目の案1000msは余裕と分かり、今回ネックなのは書き込みであることに気付きました。2000QPSが想像つかなかったのですが、直接書き込むのではなくジョブキューを噛ませるのが安全だと考えました。Launcherなら、redisがプリインストールされているインスタンスを素早く立ち上げられるし、クラスタリングも比較的簡単に出来そうだったので決まりか!?と一瞬笑顔になりました。redisはインメモリDBなので、ログを1つでも取りこぼしてはいけない今回は不適切でした。Pub/Subを採用しました。データストアにはBigtableを採用しました。GCPサービスの中では最も時系列データを扱うのに向いていたからです。(後ほど説明します)さらにバッチ問題用にBigQueryを採用しました。集計が速く、且つ全員が慣れていて学習コストが低いSQLで操作できるためです。データをBigtableからBigQueryにエクスポートしようと思っていたのですが、そのためのBigtableのリージョンがus-centralとeurope-westしかありませんでした。そこでログをリアルタイムでエクスポートしてくれるStackdriverLogging採用。(後ほど審査時に突っ込まれます)完成!・・・しかし全員が口をそろえて言いました。時間足りなくね(-.-;)採用案とりあえずQPS2000でリクエストを流してみたところ、ジョブキュー噛ませなくても余裕で耐えられることが判明しました。いうことで、APIから直接Bigtableに書き込むアーキテクチャで決定しました。問題は時間指定が多かったため、時間順にソートしておきたいと考えていました。リファレンスを読むとこんなことが書いてありました。データが非構造化列として行に保存され、各行には行キーがあり、行キーは辞書順で並べ替えられています。そこで行キーを’timestamp#IDFA'という形式にすることで、探索アルゴリズムの高速化を図りました。UTC#xxxxxxxxxxxxxx'StackdriverLoggingとAPIのつなぎ込み以下の数行コードで通常のstring型ログの書き込みが可能です。Payloadというinterface{}型フィールドに文字列を渡します。"テストテキスト"})StackdriverLoggingはBigQueryで爆速集計するために採用したため、構造化したログを渡すことが必須でした。info})無事StackdriverLoggigにjsonログが流れました。BIgQueryには1カラムに複数のデータを入れることが出来るRECORD型というデータ型があります。jsonログをStackdriverLoggingに流すことで自動的にRECORD型のカラムを生成してくれます。(設定は必要)オペレーション開発時間が終わり、いよいよデータ送信の時間になりました。すごい速度でリクエストが流れ、興奮していたのも束の間。files開始30分後、テスト時には発生しなかったエラーが!!TCPが開いたままになってるのかな??と思いプログラムコードを確認したところ、リクエストボディを閉じ忘れていました。files1分で死にました。大会終了後に社員さんに聞いたところ、linuxのファイルディスクリプタ数(同時に開けるファイル数)の上限を上げれば解決したそうです。このような、知らないと解けない問題を解けるエンジニアになりたいです。まとめとにかく死ぬほど楽しかったので、サーバーサイドに興味ある学生さんは絶対参加するべきだと思います!技術的なことしか書きませんでしたが、チームビルディング等、多くのことを学びました。参加したいと思います!*インフラ初体験の大学生2年生が書いてるので、間違いがあるかもしれません!もし見つけたら指摘して頂けるとありがたいです。(2)月別アーカイブはてなブログをはじめよう!NakaWatchさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。