CGI、マルチスレッド、シングルスレッド+イベント駆動そしてNode.js

僕はNode.jsとはそんなに関わりはなくてshibを使っているのが唯一の接点なんだけど、http://mozaic.fm/post/99334017903/10-node-jsを聞いてたら大変に面白かったので面白かった部分について書く。

このpodcastは全部で2時間以上あって全部聞くのはなかなか辛いんだけどw 僕が面白いと思った部分はCGI -> マルチスレッド -> シングルスレッド+イベント駆動 という技術の歴史的な経緯のあたりです。

インターネットが出た当初は同時アクセス数も少ないのでCGIが一般的でリクエストがくるたびにプロセスが起動してさばくというモデルで全然問題がなかった。

それがECサイトとか出てきて同時アクセス数が増えてくるとCGIモデルが辛くなってきたので、リクエストをスレッドでさばくマルチスレッドモデルが登場した。

余談だが僕が2002年に社会人になってServletの入門書とか読んでいた時はCGIとの対比はよく出てきた。Servletは1インスタンス、マルチスレッドモデルでCGIと違ってリクエストをスレッドを処理するので性能が良い。スレッドはメモリを共有するのでプロセスより軽量だからね。ただしメモリを共有するのでServletインスタンス変数を使うのは危険とかね。

閑話休題

マルチスレッドモデルで全然問題なかったんだけどSNSが出てきてさらにスマートフォンが普及するとさらに同時アクセス数が増えてきて辛い状況になりいわゆるC10K問題が出てきた。1万アクセスをさばくには1万スレッド立ち上がっている必要があるけど、メモリが足らなくなるし、コンテキストスイッチも増えるという。ただしひとつひとつのスレッドを見ていくとたいていIO待ちで遊んでいる状況だった。

これを解決するモデルとしてシングルスレッド+イベント駆動というアーキテクチャが登場した。シングルスレッドで動くけどノンブロッキングIOを使うのでIOを待っている間に別の処理をイベント駆動で行うというモデル。代表的なのがNginxでNode.jsも同じモデル。

しかしNode.jsには弱点もあって、アプリケーション側でバグがあって例外が突き抜けてイベントループまで来た場合にシングルスレッドで動いているので全体が止まってしまうというもの。なのでGitHub - isaacs/cluster-master: Take advantage of node built-in cluster module behaviorを使ってプロセス管理しているとか話してました。

そういえばshibでもエラーがあるとshib自体が落ちますね。なのでforeverとかdaemon toolsとかと組み合わせて使うのが良いかも。

こんな感じの話でした。他にも面白い話が多かったので聞いてみると良いと思います。