「どうしてもRustでISUCONに参加したい」というあなたに
Posted on Wed, 07 Sep 2016 19:58:24 +0900
残念ながら ISUCON6 では Rust の参考実装は提供されないのですが、 「おれ、どうしてもRustでISUCONに参加したいんだよね」という方や 「なんか他のチーム出し抜く最終兵器的なのないかなぁ」という方のために、 Pixivさんの社内ISUCON2016 用のRust参考実装を書いてみました。
https://github.com/hhatto/pixiv-isucon2016-rust
これをベースにすればRustでISUCONに参加することも夢ではないと思います。 ただし、ベンチマーカーでのテストはfailがでないことを確認済みですが、 一部手抜き実装があり他の参考実装の通りの機能要件は満たせていないと思いますので、 その点はご容赦を。
パフォーマンス
t2.microインスタンスでベンチマーカーとアプリを全て動かして測定した結果は以下の通りです。
go -- {"pass":true,"score":2725,"success":2505,"fail":0,"messages":[]} rust ---- {"pass":true,"score":1245,"success":1077,"fail":0,"messages":[]}
なんとGoの半分のパフォーマンスが出ています!!
実装
規模としては空行込みで1000行くらい。 以下のようなフレームワークやライブラリを使っています。
- WAF
- Nickel.rs
- かなりちいさい。ログ出力すらない。いろいろなパーツを組み合わせて使う感じです。
- MySQLドライバ&コネクタ
- nickel-mysql 本家はメンテやめたので自分のところにフォークしたやつを使ってます。
- 内部は rust-mysql-simple
- テンプレートエンジン
- Tera
- nickel-tera リクエスト拡張を提供するだけのプラグインは書いた。少しだけ使うの楽になります。
- セッション
- nickel-jwt-session
- 参考実装はmemcacheをバックエンドにしていますが、これはオンメモリ。
- その他
- 画像のアップロードの処理用に multipartのプラグイン を別途読み込む必要がある。
というような感じです。 ありがとうございました。