貧乏環境(t3.small)でFWのベンチマーク Rails6.x vs SpringBoot2.3.x vs Vert.x3.9.0 vs actix-web1.0.x (2020/05現在)

最近はVert.x推し。でもだれでも使えるSpringBootは実際どれくらいなの？ってことを知りたかった。
CPUが潤沢な場合にパフォーマンスが出るのはすごいよ。すごい。
でも貧乏人には大きなサーバーは無理。だから小さめの環境で効率が良くさばける？という観点でベンチマークする。
有名なベンチマークのアレではPlay Frameworkはそんなスコア出てない。
Vert.x vs Play となってPlayはScalaで脳死するのでJavaが使えるVert.xが勝つ、っていう私の前提。
プロジェクトでみんなが使えるか、って視点。

#　環境
* EC2のt3.small
* EC2にSSHして内部からabコマンド実行(堪忍して、傾向はわかるはず)
* SpringBootとVert.xはKotlinで書いたけどまぁ、この程度のプログラムでそんな関係あるはずない(はず)
* Vert.xはwebプラグイン付き。流石に生は辛い

# プログラム
簡単なJSONを吐き出すエンドポイントを実装(DBとかしらん、FWの単純性能JSOシリアライズってやつ？)

# ベンチマーク
## 同時接続100の世界
普通にやっとくべきベンチマークの世界
### Rails6 => 230.17[#/sec]
```
$ ab -n 1000 -c 100 http://127.0.0.1:3000/test
=> Requests per second:    230.17 [#/sec] (mean)
```
Railsに温まるという概念はなかった。何回やってもこれぐらい

### SpringBoot => 3196.47 [#/sec] (mean)
```
$ ab -n 1000 -c 100 http://127.0.0.1:8081/test
=> Requests per second:    3196.47 [#/sec] (mean)
```
叩くたびに温まって3000ぐらいで落ち着く感じ

### Vert.x => 5473.96 [#/sec] (mean)
```
$ ab -n 1000 -c 100 http://127.0.0.1:8889/test
=> Requests per second:    5473.96 [#/sec] (mean)
```
叩くたびに温まって5400ぐらいで落ち着く感じ

### actix-web => 5800.87 [#/sec] (mean)
```
$ ab -n 1000 -c 100 http://127.0.0.1:8082/test
=> Requests per second:    5800.87 [#/sec] (mean)
```
速い。

## 同時接続1000の世界
Yahoo砲ぐらい
### Rails6 => 87.49 [#/sec] (mean)
```
$ ab -n 5000 -c 1000 http://127.0.0.1:3000/test
=> Requests per second:    87.49 [#/sec] (mean)
```
負けてる。複数台アプリを横に並べるのを検討しなくてはならない

### SpringBoot => 2819.57 [#/sec] (mean)
```
$ ab -n 5000 -c 1000 http://127.0.0.1:8081/test
=> Requests per second:    2819.57 [#/sec] (mean)
```
負け始めてるけどこれだけ出てればまぁ、サーバー増やさなくても良さそう

### Vert.x => 5045.04 [#/sec] (mean)
```
$ ab -n 5000 -c 1000 http://127.0.0.1:8889/test
=> Requests per second:    5045.04 [#/sec] (mean)
```
負け始めてるけどこれだけ出てればまぁ、サーバー増やさなくても良さそう

### actix-web => 5593.91 [#/sec] (mean)
```
$ ab -n 5000 -c 1000 http://127.0.0.1:8082/test
=> Requests per second:    5593.91 [#/sec] (mean)
```
速い。

## 同時接続10000の世界
C10Kって言われてるアレ
### Rails6 => テスト完走できず
```
$ ab -n 20000 -c 10000 http://127.0.0.1:3000/test
=> テスト完走できず
```
負けてる。複数台アプリを横に並べるのを検討しなくてはならない

### SpringBoot => 完走不可、500ぐらい、3000 [#/sec] (mean)
```
$ ab -n 2000 -c 10000 http://127.0.0.1:8081/test
=> 完走不可、500ぐらい、3000 [#/sec] (mean)
```
もはや信頼できない感じ

### Vert.x => 4714.83 [#/sec] (mean)
```
$ ab -n 20000 -c 10000 http://127.0.0.1:8889/test
=> Requests per second:   4714.83 [#/sec] (mean)
```
信頼して4500ぐらい稼げる。信頼ができる

### actix-web => 1160.18 [#/sec] (mean)
```
$ ab -n 20000 -c 10000 http://127.0.0.1:8082/test
=> Requests per second:    1160.18 [#/sec] (mean)
```
あれ？だめじゃん。

#  感想
## 感想1
### Rails6
Railsはスパゲティーになるし、早期にパフォーマンスの問題にぶち当たって苦しむことがわかる。
2020年現在では魅力的とは言い難い構成でしょう。
きっとLaravelも同様。スクリプト言語の辛み
LAはめちゃくちゃあがって怖くなる
### Spring Boot
頑張ってる。誰でも見通しの良いプロジェクト構成にできるメリット。IDEのサポートも最高レベルなのが良い。
ただし、C10Kぐらいまでサービスが育ってしまうと信頼性がおちる。
同時接続1000ぐらいに抑えられるようにサーバーを横に並べる必要がありそう。
あとLAがかなり上がるが、まぁ、こんなものかレベル。
### Vert.x
さすがC10K問題に対応している。
見通しの良いプロジェクト構成のベストプラクティスをこれを書いた人は知らないのでそのへんは試行錯誤が必要そう。
ということは開発に参加するたびそのサービスの構成の文化を知ることから始める必要がありそうなのかも。
IDEのサポートは最高レベルなのが良い。
LAは一番低かった。

### actix-web
すくないアクセス数では最速。
だけどC10Kになると死。Rustの書きづらさを考えるとこれは痛い。
開発環境はVSCodeなので開発も一歩Kotlinに劣る。コンパイル鬼遅い。
クロスコンパイルは結局成功せず。Linuxへ持っていってコンパイルした。これもつらい。
バイナリ一発でサーバーにrustの環境がなくても動くのはネイティブバイナリの強み。
静的リンクしてくれるようにコンパイルしたので更に可搬性は優れる。
私がRsut慣れしてないもあるが開発は辛い。デファクトのIDEがないのが辛みかな。

## 感想2 
SpringBootはやはり鉄板。便利機能てんこ盛りできっと開発体験は最高。
C10Kになっちゃうことなんて基本ないのでぱっぱり鉄板SpringBootなんでしょう。(Playどうなんでしょ?)
もはやRailsは情弱なのかも(あ、ごめんなさい、こういう強い否定言葉は良くないですね)
プログラミングを楽しみたい人はVert.xを使えばよいのでは、って感じ。
Vert.xは肌触りSinatraです。ってことはプロジェクト構成大変そうでしょ？
私は楽しみたいのでRustのWAFが非同期周りの仕様追加を受けて落ち着くまではVert.xで楽しむつもり
actix-webは今回は残念な結果になった。actix-webの知識がなさすぎるのでなにか間違っているのかもしれない。RustのFWは非同期まわりの仕様追加したてなので、これからどんどん強くなっていくとおもうので将来に期待ですね。

# 感想3
Railsは比較するとデプロイがめんどい。
SpringBootとVert.xはjar一個にまとまるのでデプロイめっちゃ楽。
こういうところも大事

# 感想4
Rails系はテストコード書きやすいよね。そこは高評価。
Rustもテスト書きやすい(テスト前提の感じすらある)

# 感想5
貧乏環境で楽したいならSpringBoot、C10Kまでなにも心配したくないならVet.x
JVM強い。

# 感想6
Kotlin歴3日ぐらいだけどJava書ける人は何も勉強しなくてもKotlinできるはず。なぜならJavaのソースをIDEに貼り付けると自動で変換してくれるのよ。Kotlin良いよKotlin。

# 感想7
h2oは最近動きないので

```
ELB(SSL終端) -> nginx(不要かも) -> Vet.x
```

が貧乏人には「さいつよ」とおもいました。

# 以上です。
Elixirは情報少ないので検証しないよ fukuoka.exのだれかやってC10K
* TODO: Playどうなの？
* Node(Express)どうなの？