ISUCON6 4位でした

会社の同僚の@wata_dev@osadake212とISUCON6本戦に出場して4位でした。チームメンバー全員普段アプリケーション書いてるエンジニアでインフラ寄りのメンバーがいなくて複数台構成の本戦はきついだろうなと思ってたので、4位という結果はかなり健闘したほうだと思うけどやはり悔しい・・。

本戦での役割的にはざっくり

  • @hokaccha: 方針たて
  • @wata_dev: インフラ
  • @osadake212: アプリケーション

という感じでした。

どんなアプリケーションだったか

  • リアルタイムお絵かきアプリ
  • Reactでサーバーサイドレンダリング
  • 裏にAPIサーバー
  • SSEで変更をpush
  • 全部Docker

序盤

itamaeでMySQL, Nginx, Ruby, Redisあたりのレシピを作っといて複数サーバーでも必要なミドルウェアといい感じの設定をすぐに入れられるようにしといたんだけどまさかのDockerだったのでそのまま使えなくてパニくったのが序盤のハイライト。

Docker全くわからないという感じではなかったものの、メンバー全員そこまで熟練しているわけではなく、最初の構成の確認とかローカルに開発環境作ったりするのに手間がかかって初動が遅れた。

結局昼前ぐらいに@wata_devの提案でDockerをやめようと決断して全てのコンポーネントを脱Dockerしてベンチ通ったのが13時ぐらいだった。このあたりはほとんど@wata_devにやってもらった。これで事前に仕込んどいたitamae使えるようになって僕歓喜

終端をNginxで受けて静的ファイルをNginxで返すぐらいまではやって多少スコアあがったぐらいだった。ここまでアプリケーションには全く手を入れられず。

中盤

とりあえずサーバー5台をフルで使うための分散戦略を考え始めた。全サーバーにReact、RubyMySQLを同じ構成で立てて、room idごとに分散させつつtokenとかroomなどの共通で使うデータだけ一箇所に集めて、他はそれぞれのサーバーにたってるMySQL見るよにすればよさそうという案でアプリケーション側の実装とインフラが側の設定を始める。

これは最終的にはうまくいかなくて、結局トップページのroom一覧をつくるのにstrokeのデータも中央にないとダメで、failもでまくっていたので一旦諦めてMySQLは一箇所に変更した。完全に方針ミスった。

とりあえずアプリケーションの分散はできたのでこの構成でアプリケーションの高速化に取りかかることに。が、時間が足りなすぎた・・。この時点で16時ぐらいだったかな・・。

終盤

とりあえず分散させただけで高速化ほとんどやれてないので、アプリケーション側を改善に入る。ReactがSSRしている/img/:idが重いことはわかっていたのでそこをキャッシュしようということになった。

JS側でキャッシュしてRubyは更新のときにキャッシュをpurgeする作戦で、僕がJS側、Ruby側を@osadake212にやってもらって割とさくっと実装できたが、僕がタイポしまくりで本番を壊しまくってたのが終盤のハイライト。

その実装が入って20000点を超えた。その後色々やりたいことはあったけど時間内でできそうなことがなかったので、ログ切ったり再起動チェックしてフィニッシュした。結果failせずに4位だったのはよかった。

その他の感想

  • 序盤に、httpsってことはHTTP/2話せそうだねーという話はしていたが最後のほう完全に忘れていた
  • Node.js/Reactあたりは自分の得意分野だったのにもかかわらずそこを最適化するまでに至らなかった。一番の悔しいポイント・・
  • SSEのstreamの接続が数秒で切れるようになってる実装の意味がわからなくてだいぶそっちに頭もっていかれた
  • 途中の方針完全に失敗してごめんなさいという気持ち
  • itamae最高だった

謝辞

@wata_devは予選で一番難しい正規表現の改善をお願いした結果、最後までバグがとれなくて、つらい思いをさせてしまったんですが、本戦ではインフラの構築から細かいところまで色々とやってもらって本当に助かりました。

@osadake212には雑にアプリケーションの実装方針伝えたらさくっと実装してくれて助かりました。逆に実装早くて手持ち無沙汰にさせてしまってた感すらありました。

よいチームメートとでれて楽しかったです。

また、出題チームは本当にいい問題ありがとうございました。運営チームも毎年よい大会をありがとうございます。来年もがんばります。