ISUCONでRustで参加する同胞達や、Rustの参考実装を書く人の参考に少しでもなればとこのエントリを書いてます。(いや実際全然わからないのでもっといいの教えて!ってのもあります。はい。)
今年のISUCONはRustで戦います。
なぜなら、私はRustが好きだからです。
ISUCON、Trust Rustというチーム名で参加登録しました。Rustを信じろ!!!!!!!!!!!!
— でこくん (@dekokun) July 10, 2020
しかし、私含めてチームメンバー全員がRustでWebアプリを書いたことがなかったため、毎週ミーティングを行いRustの勉強としてやることを宣言して1週間後に進捗報告をしまたやることを宣伝する、ということを繰り返しています。
ただそれだけではチーム全員で動くISUCONの訓練としては弱いので、ISUCONを模したリハーサルをしてみました。
お題
お題としてはISHOCON2というのを使わせてもらいました。以下理由でISHOCON2を選定しました。 ただ、もちろんRust実装なんてものはないので、リハーサルはそれをRustで実装し直すところからスタートです。
- ベンチマーカー、webアプリ共にAWSのAMIがあるため、事前準備がほぼ0で始められる
- 実際、事前準備15分ほどで開始できた
- 実際にISHOCON2を利用したコンテストが何度か開かれているという安心感
- ISHOCON2のREADMEに書いてあった
- 1人で解くことを想定してだと思うが普通のISUCONよりも簡単であり、全部を1からRustに書き換えるうちのチームが最初に取り掛かる題材としては適切な難易度に思える
Rustで再実装するために使ったライブラリ群
webアプリケーションフレームワーク
DB接続ライブラリ
- sqlx
- 最初はmysqlを使用しようかと思っていたが、ISUCONでmysqlではなくpostgresqlとかが出てきたらダルいなと思っていたところに、AtCoder Problemsがsqlxに乗り換えようとしている話を見てsqlxについて知り、実際に触って見たら非常に楽でいい感じだったため採用した
- query!マクロによるコンパイル時のクエリチェックが異常に優秀。コンパイル時にDBに接続しにいき、SQLの構文及びカラムの存在有無のチェックがされるの大変すごいと思う
Rustのsqlxのquery!マクロとvscodeのrust-analyzerの組み合わせ、異常に強力だな。環境変数にDBの接続先を入れておけば、書いてるだけでマクロ内のSQLのチェック(構文及びカラムの存在有無確認も)してくれてエラー出してくれる。パネェ。 pic.twitter.com/0SjjvU2uIX
— でこくん (@dekokun) August 15, 2020
- ちなみに、リハーサルの後にも引き続き実装を進めたが、 SQLの
where column in (x, x, x)
みたいなの書くのが面倒で既存実装をRustに移植する過程で更に N + 1問題を作り込んだw- ISUCON-2020-suburi/main.rs at master · dekokun/ISUCON-2020-suburi · GitHub
- 本選までには簡単にできるようにしておかないと
テンプレートエンジン
当日の進捗
- 皆、Rustでなんとなくエンドポイントの実装ができるようになった
- が、全然実装は進まなかった。Rustだけ書いていたわけではない(アクセスログの解析や、ローカル開発環境を整えるのに異常に時間がかかった)が、それにしても全然実装が進まなかった。
これはやばい、とにかくRustの初期実装が必要だ、と思っていたら、以下でRustの参考実装があるらしいということがわかり、なんとか首の皮がつながった感じがありました。参考実装に応募してくれた皆さんには感謝感謝です(実はうちのチームからも1人応募したけど参考実装者には選出されなかった)
ちなみに、参考実装者誰か出てくれないかという一心でrust-jpのslackに書き込んだらそれを見て応募してくださった方もいるようで、本当にありがたいなと思いました。めちゃくちゃ嬉しかったです。maguroさんありがとうございます!
こんにちは!Slackででこくんさんの投稿を見て「おっ、やってみたい!」と思い申し込みフォームから申し込みはしまして、練習のためにisucon9をRustに移植してみてるという状況だったりしますw
— 🍣maguro🍣 (@yusuktan) August 11, 2020
書いたプログラム
以下リポジトリで実装をしていました。 github.com
やった感想
リハーサルの後にチーム全員で振り返りを行いました。Rustに関係ありそうなところをピックアップします。
- crateのコンパイルに大変時間がかかるので、必要なcrateは事前に列挙して最初からコンパイルしておくと便利
- Rustのバージョンを変更させるとcrateがコンパイルしなおしになり大変時間がかかるのでRustのバージョンは事前に決めておいて最初からrust-toolchainファイルで固定しよう
- vscodeのRemote SSHを使ってサーバ上で、rust-analyzerなど使いながら開発するとメモリが3GBほど食われて非力なサーバで複数人が開発すると死ぬ
- ローカル開発環境を作りました
最後に
Rustの優秀さを知らしめるぞ!