ISUCON10にElixirで参戦して、惨敗してきました。

9/12(土)に行われたISUCON10にぼっち参戦してきました。

以前から気になってはいたものの、参加できていなかったので、ようやく初参戦することができました!

 

結果は・・・

 

はい、スコア0でフィニッシュでした 😇

 

なぜElixir?

f:id:tamanugi:20200914234205p:plain

(微妙に名前隠れてないけど、本名じゃないしまぁいいってことで)
 

純粋にElixirをもうちょっと使えるようになりたいなって思っていたり、社内Slackの#isuconでこんな冗談を言っていたりして、あとに引けなくなったとかそんな感じです。
(Elixirエンジニアに転職したいという思いもあったり)

過去のISUCONでもフルスクラッチ参戦した方がいたみたいなので、まぁ可能性は0じゃないかと思いチャレンジしてみました。

 

やったこととか

リポジトリはこちらになります。

github.com

 

ElixirのWEBフレームワークといえば、Phoenixですが、ISUCON向きではないなと思い、Plug+Cowboy+Ectoといった構成でチャレンジしました。

他の参照実装でも大体薄いWEBフレームワークの実装なので、それに合わせたような形ですね。

一応実装 5時間 + チューニング3時間で考えていたのですが、結局実装が終わらずでした・・・😭

完全にスキル不足ですね。。。

 

はまったこと

SQLの実行結果を構造体に入れる方法

Rubyの参照実装を参考に実装していて、とりあえずSQL直書きでいいかと思っていたのですが、その実行結果を構造体に変換する方法がわかりませんでした。

終わってから調べてみたところ、Ecto.Repo.load/2 を使えばできるみたいでした。

 

レスポンスが不正です

スコアが0になったのは、ベンチマークのアプリケーションの妥当性チェックを通すことができなかったからです。。。

ローカルで開発して、curlで叩いて目視で確認していました。なので、上で書いたような構造体にしてからJSONに変換していなかったせいで、ぱっと見それっぽいレスポンスが返ってきているように見えても、フィールド名が違った、構造が違った・・・ということがほとんどのAPIで発生してしまっていました。

しかもベンチマークのエラーメッセージでは細かいエラーが確認できないため(当たり前ですが)、何が違うのかを把握するのに時間がかかってしまいました。。。

Plugのテストは簡単にかけるので、ざっくりとレスポンスの型があっているかだけでもテスト書けばよかったなと思います。

ファイルのアップロード方法がわからなかった

もうこれは問題外なレベルで恥ずかしいのですが、Plugでmultipart-formを受け取る方法がわかりませんでした😇

plug Plug.Parsers,
  parsers: [:urlencoded, :multipart, :json],

みたいな感じで、:multipart を追加するんだろうなと思いますが、ちゃんと試してみようと思います。

だいぶ終盤だったので、ここの実装は諦めて isuumo.go.service を立ち上げて、Nginx 設定追加してそちらに流すようにしました。
(もはやISUCONとは。。。)

EctoのNo Database Selected 

アプリケーションの妥当性チェックの段階でそこまでクエリを実行していないはずですが、Ecto経由で実行したクエリは No Database Selected のエラーで失敗するという事象に悩まされました。

Too Many Connections とかのエラーならまだわかるのですが、No Database Selectedのエラーで失敗するというのがわからず。。。(同じAPI/箇所で失敗するのではなく、いろんなとこで1,2回だけ失敗する)

pool_sizeの指定がわるいのかと思い、適当に変えてみたけど変わらずでした。。。

これがなければ(一部はgoに流していたものの)妥当性チェックを抜けれていたと思うのでとても悔しかったです。

 

その他

久しぶりに .ssh/config をいじりました。 ProxyJump といった項目が初見でしたが、比較的最近のOpenSSHで追加されたんでしょうか?

ポートフォワーディングは以下のように .ssh/config に追加して、 ssh isucon-web するだけで行けるようにしていました。

Host isucon-web
ProxyJump isucon-bastion
User isucon
HostName xxx.xxx.xxx.101
LocalForward 8080 xxx.xxx.xxx.101:80

 

感想

結果こんな形で参加枠を潰してしまいごめんなさい!って気持ちになりましたが、競技中はめちゃくちゃ集中して取り組むことが出来て、凄い楽しかったです。

また感想戦も交われない寂しさと悔しさも強かったですが、それ以上にとても色々と勉強になりました。SPATIAL INDEXとかは知らかなったし、その他色々よく気づくな〜ってポイントが多く尊敬の念でいっぱいでした。

来年こそはちゃんと修行して、Elixirで予選突破したいと思います!

 

最後に運営のみなさま、とても素晴らしいイベントに参加させていただきまして、本当にありがとうございました!

 

PS. 決勝進出した弊社つよつよエンジニア3人組頑張ってください〜〜 💪