ISUCON12に参加して予選3位でした

@rrreeeyyy とチーム「たつや」でISUCON12予選に参加して、3位でした。2年ぶりの本選楽しみです。

予選でやったことをざっとまとめておきます:

  • 最終的な構成は
  • とりあえずシャーディングを見据えてMySQLへ移行
    • sqlite3-to-sqlという便利スクリプトがおいてあったのでfor f in *.db; do sqlite3-to-sql "$f" | mysql; done 的なワンライナーで流し込んだ
    • 何箇所かSELECT文にwhere tenant_id = ?がなかったので追加`
    • 初期データ以外を消すようにinit.sqldelete from player where created_at > 1658534400的なやつを追加
      • 最初このデータ削除にバグがあり、たまにベンチマークが失敗する問題に悩まされていた(ベンチマーカの出力が間違っていたのもあって、的はずれな調査していた…)
  • flockを消して、トランザクション
  • 諸々DBのインデックスを追加
  • スコア入稿部分でデッドロックが発生していたので、削除せず追記のみになるように改修
    • player_score_commitテーブル、player_scorecommit_idカラムを追加し、スコアを取得する際に最新のcommit_idの行を取得するように。primary keyがユニークじゃなくなるので適当なauto incrementなカラムを追加。
  • ID採番をUUIDに
  • スコア入稿をバルクインサートに
  • connectToTenantDBのtenant ID mod 2で2台を使い分け
  • GET /api/player/player/:player_id, GET /api/player/competition/:competition_id/rankingの結果JSONをキャッシュ
    • スコア入稿でキャッシュをパージ