ぜのぜ

しりとりしようぜのぜのぜのぜ

ISUCON13に参加した #isucon

ずっと気になってはいたけど参加していなかったISUCONに初めて参加した。最終スコアは28,232。競技もお祭り感も楽しかったけど手札が少なかったり手が遅かったりですべてを楽しめなかったのが悔やまれる。

練習会は2回で、1回めは半日でcatatsuy/private-isuを、2回めは本番と同じ形式でisucon12-finalを解いた。合間でISUCON本も一通り読んで手を動かした。それと、普段使わないVS Codeのショートカットを手に馴染んでいるXcodeのものに合わせた。これはかなりよかったと思う。GitHub Copilotも入れた。

本番でできたのはこの5つ。

  1. アイコンのハッシュ値の事前計算
  2. 条件付きGETリクエストの対応
  3. PowerDNSのzone file移行(途中まで)
  4. リアクション一覧のN+1解消(revert)
  5. ライブコメント一覧のN+1解消(revert)

アイコンのハッシュ値の事前計算は、アイコンのハッシュを返すエンドポイントで毎回DBから読んでハッシュを計算していたのをアイコンの保存時にハッシュを計算してDBに入れるようにしただけ。カラムの追加でSQLシンタックスを間違えたり型を間違えたりしたのがよくなかった。最終的に型はCHAR(64)にしてfmt.Sprintf("%x", hash)して入れるようにした。

クライアントがそのハッシュをIf-None-Matchヘッダに入れてリクエストしてきた場合はサーバーのものと比較して同じだったら304を返してよいという仕様があった。それに対応したのが2つめ。Request().Header.Get("If-None-Match")ではダブルクオートで囲まれた文字列が返ってくるのでちょっとハマった。printデバッグして気づいたが、こういう細かいデバッグをするだけでもベンチマーカーを走らせないといけないのがしんどい。リクエストをすべて記録しておいて模倣するツールでも作ればよいんだろうか。もうある?

3つめはできることがないと泣いていたら一緒にやりますかと言ってくれたやつ。ここほんとに情けなかった。結局巻き取ってもらった。何百歩か譲ってこれができないのはよいとしても、4, 5のような解消していないN+1に気づけなかったのはよくない。

4, 5つめは2重にN+1になっていたので外側から解きほぐしていった。この方針はよかったと思う。ただ、Goの挙動を理解していないのが原因っぽいバグで落ちたのでrevertした。

全体的に基礎的な力が足りない印象なので少なくともそこはどうにかしたい。まだ成長曲線の美味しい部分にはいると思うので楽しめるはず。

運営の皆さんと組んでくれたチームメンバーには感謝です。ありがとうございました!