Docker + Node.js + TypeScriptがサーバーサイドで最強な理由
最強というと語弊があるのは承知なんですが…keroxp.icon
自分なりに、Webアプリケーションを作っていく上でこの上記の組み合わせは2018年現在ベストな構成だと思っている
のでその理由をつらつらと
書いていく気になったkeroxp.icon2018/10/2
/icons/golang.icon
hr.icon
理由1: Docker
理由2: Node.js
Node.jsはサーバーサイドjsのデファクトスタンダードになって等しいが、今から5~6年前くらいは結構厳しい時代だった
サーバーサイドなのにシングルスレッド?m9(^Д^)プギャー
速さが命なのにジャバスクリプト?m9(^Д^)プギャー
こんな感じだった(偏見
実際いろいろなAPIがunstableで0.xxがずっと続いていた期間も長かった
今Node.jsのバージョンは11である
上がりすぎワロタという感じだけど、Node.jsは後方互換を重視するので基本的なAPIはほとんど変わっていない
Node.jsが過去プロダクションユースで懸念されていた並列性と実効速度の問題は、実際ほとんど解決されている
理由としては、Dockerが誕生したことが大きい
Docker時代、アプリケーションのデプロイ単位はコンテナ、もしくはコンテナ群(Pod)になった
それまでデプロイの単位は仮想マシンで、仮想マシンの中ではたくさんのプロセスが動いていてCPUも一応マルチコアだった
マルチコア環境の仮想マシンでシングルスレッドのNode.jsアプリケーションを一つだけ動かしても、マシンの性能を使い切ることはできないのは当然である
Node.jsのコアあたりの処理性能は低くなく、むしろ高水準にある(当然ながら、最高ではない)
その理由はV8のJITコンパイラがどんどん改善されて、CPUヘビーなタスクほど最適に実行されるようになったからである
DockerコンテナはvCPUリソースを自由に設定できるので、Node.jsコンテナをシングルコアのコンテナとしてデプロイすればリソースのユーティライズという観点から見れば、無駄はなくなる
AWSのEC2やECSのコンピューティング料金はvCPUが一つ増えれば値段が倍なので、シングルスレッドのデメリットは無い
Node.jsにとってDockerが更に追い風になったのは、「得意なことは得意なコンテナに」というマイクロサービスが台頭してきたこともある
Node.jsがシングルスレッドである以上、CPU/IOヘビーなタスクはNode.js単体では行いにくい
画像処理とか、グラフの計算とか
DockerはコンテナをPodとしてまとめてデプロイできるという強みがあり、APIサーバーはNode.jsで、アップローダや画像処理はGoのリバースプロキシで行うといったようなことも可能である
理由3: TypeScript
/icons/golang.iconにハマっていて少し自信がなくなってきていたけど、やっぱりいいと思う