ISUCON7予選通過 & 技術書典3出展

ISUCON7

f:id:spring_raining:20171024014457p:plain

ISUCON7に私と@susisu2413@amaya382の3人で参加しました.学生枠ですが,チーム名「チーム名を考えるのが苦手すぎる」として最終スコア89047で本戦に出場できることができました!ヤッター

isucon.net

私はアプリケーション(Node.js)担当でしたが,RDBの知見が何も無いのが分かっていたので,最初からインデックス追加やクエリの改善を諦めてMySQLからガバッとRedisに移し替える作戦で高速化を目指しました.実装間に合って良かった…

実装中は@susisu2413がESLintを導入したおかげでコードが衛生的になり,実装中にいくつかバグを見つけることができて良い体験でした.デプロイ周辺も@amaya382に任せきりになり頭が上がらない思いです🙇

susisu.hatenablog.com

amaya382.hatenablog.jp

感想

  • 役割分担が適切だった

    • 前回はアプリの改修を1人に任せており,1人がひたすら実装するのを2人が見守るみたいな状態になってて良くなかった.やはりアプリ2人ミドルウェア1人の構成が最適そう
  • 事前にpixiv社内ISUCONをやってたらそっくりの問題が出題された

    • 画像ファイルがDBにそのまま入ってるとことか
    • @amaya382にシュッと初期DBから画像を取り出してもらい,@susisu2413がササッと画像アップロード部分の実装をしてくれました🙏
  • 3人が同じ場所に集まるの大事

    • ペアプロで確認しつつ実装できた
    • 予選開始時間延長で期せずしてアニメ鑑賞会になった.このはな綺譚は最高
  • Redisのノンブロッキングな動作に悩まされた(本質と全然関係ない)

    • RedisにはAUTOINCREMENTが無いためHLENで要素数を見る→idに要素数+1を設定するという実装にすると,同時に要素を追加されたときにidが重複することがあることが分かり,結局乱数をidに設定する雑な解決策になった
  • マニュアルを誰一人精読してなくて,実行環境は1台のサーバで完結しており残りの2台は予備だと勘違いしてた

    • 本戦問題何もやって無くて複数台構成という発想が無かった
    • アホス
    • マニュアルはちゃんと読もう!!!!!!
  • Cache-Controlを設定するとベンチマーカがちゃんと考慮してくれることとか,静的コンテンツは304を返しても良いことに気づかなかった

    • マニュアルは(ry
    • この辺りはとにかく勉強不足だった
  • sleep(1)に手をつけてなかった

    • GET /fetchがポーリングされていることには気づきつつも,1秒よりも延ばすとタイムアウトでスコアが減ってしまうと思い込みそのまま放置してた
    • というか今見たらマニュアルにちゃんとヒント書いてたね…
  • 何も考えずにMySQLをRedisに置き換えたけど,果たして効果はあったのか??どこがボトルネックになっているか確認して,ちゃんとDBが原因であることを確認してから取りかかるべきだった

    • しかしDBは別サーバで動いていたので確認しようがない…
  • アプリとNginxをUNIXドメインソケットで繋ぐ等基本的な高速化手段を忘れていた

    • やるべきことをリストアップすると良さそう

一般枠のスコアを見ると何もかも戦うステージが違う感じで尻込みしますが,何とか本戦でも爪跡を残せるよう頑張りたいと思います.

マニュアルはちゃんと読もう!!!!!!

技術書典3

f:id:spring_raining:20171024014835j:plain

あと全然関係ないですが,ISUCON予選2日目に開催された技術書典3で「やっていく合同誌」という合同誌を頒布していました.私はdeeplearn.jsについて記事を書いています.

deeplearnjs.org

ISUCONに参加して技術書典に行けなかった皆様に朗報です!!!「やっていく合同誌」は電子版で販売しております!!! COMIC ZINにも委託しているので物理本も買えます!!!ご興味ある方は是非!!!

booth.pm