ISUCON8予選を突破しました!!!!!!!
k02というチームでISUCON8予選に参加し、予選を無事通過して本戦出場が確定しました。
感想と色々と良かった点や反省点をまとめようと思います。
やったこと
主にgolangの実装を改修を担当してた。
- githubやgitまわりの設定
- N+1の対応を何箇所か対応
- reservationsテーブルでFOR UPDATEしてない箇所の対応
- ORDER BY RAND() LIMIT 1してるやつをリストで取得して、golang側でシャッフルして1件選ぶ実装
- 無駄にeventsやsheetsを取得してる箇所を修正
- reservationsテーブルにuser_idのindexを追加
- Adminのreportのsqlを @yasu が改善してくれてそれを組み込んだ
良かった点
- 事前にk02用のkibelaを用意した
- 当日の作業ログとかに埋もれてしまうpassやip、deployコマンドなどなどをslackを辿らずに調べられるようにするため
- 横並びで全員外部モニタがある状態の会場を用意した
- コミュニケーションコストを下げた
- 序盤にちゃんとサービス触って理解する時間をとっていた
- これによって途中で怪しい挙動してるときにrevertする決断が早かった
- Lock周りの挙動がイメージしやすくなった
- DataGripでER図をさっと作成していつでもデータの関連を見れるようにした
- h2oはなんかパッと見そのままでも問題なさそうと @waniji が判断し、ひたすらDatabaseのチューニングに全力を注いだ
- 流石に4回目だからか山賊してもスコア上がらないのはみんな理解してて冷静に状況判断できてたのかなと思いました
- 去年は一発逆転でめちゃくちゃして結果Failしてたので、Failが発生しないように安定するのに注力できたのは良かった
反省点
- チームの作業担当がふわっとしていて、後半までみんなウズウズしていた
- nginxかなーと思って用意してたgoaccessとかが使えなかった
- 自分以外がほとんどコードに手を付けられなかった(golang慣れしてて一か八かdeployを繰り返してた)
- これは手元で動作する環境をさっさと用意しなかったのが一番の原因
- sqlxの導入やちょっとしたリファクタリングができず終始しんどいコードを読んでた
- これも手元で動作する環境さっさと用意すれば、悩みながらリファクタしていけて結果的にコスパ良かったと思う
以下とかもさっさとsqlx入れれば何回か実行エラーになってたタイムロスしたのを回避できたはず...
golang実装がselect *でScanしててsqlxとかに置き換えるかマジで何回か悩まされたのはエグかった。
— きょこみ@k02 (@k_yokomi) 2018年9月16日
まあいつもgolangは優遇というか、問題解決が容易でチート感あるのでいいバランス配分だった気がする。
感想
今回は、飛び道具よりも愚直にSQLを改善したりindexを貼っていくのが大事な題材だったな〜と思いました。
普段仕事でやってるようなSQLをこねくり回して実行計画をみたりER図みたり、サービスの挙動としてあるべき姿をイメージしてみたいな感じでとても良かったです。
order by randを雑にlimit 1にして順番に着席させたるわ!っていう悪魔的発想で改修したら、ベンチマークツールに速攻で座席がランダムではありません!って怒られたのは爆笑した。
— きょこみ@k02 (@k_yokomi) 2018年9月16日
予選突破したからと言われるとあれなんだが...
— きょこみ@k02 (@k_yokomi) 2018年9月16日
いつものCacheとか飛び道具で一発逆転!みないな感じじゃなく、サービスをしっかり触って理解して本質をしっかり改善していくとスコア上がる感じの出題になっててめちゃ良かったです!!! #isucon