この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
rick No22です。
今回はnodeJSついてです。
nodeJSとは?nodeJSが生まれた経緯等話していきます。
nodeJSとは?
「JavaScriptを用いたNon-blocking I/O環境」です。
Non-blocking I/Oとは?
データの送受信を行う際に、完了せずに他の処理を開始する通信方式です。
例えるならば、
洗濯機を動かしつつ掃除して完了したら洗濯物を干すといったながら作業のようなものです。
nodeJSが生まれた経緯
「C10k問題対策用」としてnodeJSは誕生しました。
※ Cは「Client」10kは「1万台」を表しており「クライアント1万台問題」ともいわれています。
C10k問題とは?
クライアントの数が多すぎてサーバがパンクする問題です。
2009年当時、「apache」vs「nginx(エンジンエックス)」という構図がありました。
※apacheはスレッド方式、nginxはイベントループ
apacheのスレッド
スレッドはクライアントが増加するごとにスレッドが増加し、
スレッドが増加するごとにメモリの使用率が増加。
nginxのイベントループ
全ての実行要求を一つのキューに保存し、一つ一つ実行していく。
スレッドは使用するユーザが増えれば増えるほどメモリをくうため、イベントループのnginxが有利という形になりました。
しかし、イベントループにも弱点があります。
実行できる要求が一つのみになるということは、
その一つの処理が遅いと他の処理もその分遅れてしまうことになります。
この問題を解決しようと考えたのがそもそものnodeJSの始まりです。
ではどうやって解決したのか?
その答えは最初に述べた「Non-bloking I/O」が使用されます。
Non-bloking I/Oを使用することにより、
実行要求をそれぞれ平行して処理することを可能にしました。
イベントループを採用している言語は他にもあり、
Python:Twisted
Ruby:EventMachine
Perl:CokoのAnyEvent
などがあるが、
Non-blocking I/Oは強制されていない。
このNon-blocking I/Oを強制したものがnodeJSです。
ためしに触ってみたい方は、
はじめての共同作業 Canvas編がおすすめです。
これを使用するにあたって1点注意点が有ります。
nodeJSなど使用するものすべて最新で動かすことができますが、
落としたファイルをそのまま起動させようとすると
TypeError: Object #