yosuke_furukawa:C10K 問題というのはそもそもクライアント10000台を1つのサーバで捌くにはどうしたらいいかという問題でした。Node.js の話の前に Apache と
NGINX が競い合ってたときの問題です。
Apache はリクエストが入るたびにスレッドを起動するというマルチスレッドモデルでした。
NGINX
はリクエストが入ってもスレッドを起動させず、基本シングルスレッドで、IOの待ち時間のときに他の処理を実施するというシングルスレッド・イベントループモデルでした。
さらにその前はマルチプロセスのモデルも存在しました。CGIとかですね。
C10K問題という話の前にそもそもウェブアプリケーションはどこが律速になりやすいかという話をすると、一番律速になっている部分がIOの待ち時間というデータがあります。ここを逆手に取った戦略がNGINX,
Node.jsが取った「シングルスレッド・イベントループモデル」ですね。
つまり、「IOで待っている間に他のことやってしまえばいい」という戦略です。事実NGINX, Node.js
はこれで一定のシェアを確保したんじゃないかと思います。
さて、それはそれとして、 C10K
問題は2010年代に流行りました。そこからもはや時代が変わっています。クライアントは10000どころか、10万、100万居ます。またそもそもクラウドで1つのサーバだけを運用することはありえません。もっと言ってしまえば、昨今はコンテナになり、OSのレイヤから仮想化されて複数の物理サーバ、複数のコンテナで管理されています。この時点でクラシックなC10K問題は解決手段が多様化しています。インフラのレイヤで改善する方法もありますし、
Apache / NGINX もそれ単体で使うというよりロードバランサやCDNなどを併用する事も増えました。
要はスケールが変わることで1つのサーバをどう使うかという議論よりも複数のコンテナ、サーバ、外部のCDN、ロードバランサをどうやってうまく使うかでアーキテクチャとしての解決が行われるようになりました。
このように、C10K問題自体が過去の議論だったという事は理解していただいても良いのではないかと思います。
では、NGINX/Node.jsの優位性はなくなったのかというと、それはまた別な話です。1つのサーバで効率的にリクエストをさばくという方法は他にもありますが、今でも重要な要素にはなっています。1つのサーバが効率的であることに越したことはないので、そういう点では今でも有用です。
加えて言うと、 Node.js の特徴はイベントループというだけではありません。むしろそれはオマケに過ぎないと個人的には思っています。どちらかというと、
JavaScript
がサーバで実行できるという点が一番大きい点だと思っています。JavaScriptは過去には文法的にも言語仕様としても辛いものでしたが、昨今TypeScriptの台頭や
ECMAScript の進化により、 async-await
等の機能が発達し、結果としてそこまで使いにくいものではないと思っています。エコシステムの進化も相まって、今ではイベントループの効率性だけではなく、開発者が通常選ぶものとしても扱いやすいものになってきているのではないでしょうか。