ISUCON12 予選 参加記

今年も参加しました

結果

チーム「情報処理部」で参加して、競技中のスコアの最終値は3270、結果は322位相当でした。 メンバーは id:mizdra との2人で参加しました。

やったこと

github.com

  • Datadog の導入
  • MySQL に乗っているテーブルに index を追加
    • Datadog で APM からスロークエリを列挙して上の方にあるクエリに有効なインデックスを追加
  • ID の採番を ulid にする
    • Datadog を見ると REPLACE INTO という見慣れないクエリが見えて「なんだこれ」ってなったけどよく見たら ID を採番しているだけだった
    • uuid でもいいかなと思ったけど ulid にした
  • リーダーボードを Redis に乗せる
    • リーダーボードといえば Redis かなと思ってやってみたけど間に合わなかった...
    • 解説や他の人の参加記を見ても採用しているケースは少なかったし方針が悪かったっぽい
    • 初期データで player_score に入っているデータを Redis に乗せる必要があり、その処理を POST /init で呼ぶと30秒を超えてつらかった
      • ほとんどこの対応に時間を費やして時間内に終わらなかった
      • row_num が一番大きいやつを選べばいいことはわかっていたけど、圧縮するという発想がなかった...

できなかったこと

  • テナントのロックがきつい
    • mizdra さんが MySQL に変更していて、完了すればトランザクションで排他処理ができると思って何もしてなかった
    • 今思うととりあえずアプリケーションレイヤーで RW Lock 実装すればよかった
  • billing が重たいまま
    • 方針を考える時間がなかった
    • N+1 も残ったまま
    • サマリー作れば軽くなりそうだなという気はしていた

感想

  • 自分は Redis 化、mizdra さんは SQLite => MySQL 化をやっていて、どちらも一発逆転ホームラン的な作業をしていたのが良くなかったかも
    • どちらも完了すればスコアが大きく伸びることが期待できるけど、作業が完了しなければスコアの増分は0
    • 小さく積み重ねる系のタスクも別ラインで進めたほうが良かった
  • ほぼ触ったことのない Redis をぶっつけ本番で選んでしまった
    • ↑と似てる
    • SQLite のまま進められる改善をやればよかった
      • RW Lock の実装など
  • Datadog の無料枠が終わった
    • 来年は課金して挑みます
  • SQLite という新しいミドルウェアが出てきて新鮮だった
    • MySQL v8 なのも初?
  • 今回はいつもに増して無力感が強い予選だった
    • 個人的に ISUCON の予選突破がソフトウェアエンジニアとしての1つの目標で毎年参加している
    • しかし予選突破に近づいたことがなく、あと何を学べば目標に近づけるかがわからない...