Node.js® について
非同期イベント駆動型の JavaScript ランタイムである Node.js は、スケーラブルなネットワークアプリケーションを構築するために設計されています。次の「hello world」の例では、多くの接続を同時に処理できます。各接続ごとにコールバックが呼び出されますが、処理すべき作業がない場合、Node.js はスリープします。
const { createServer } = require('node:http');
const hostname = '127.0.0.1';
const port = 3000;
const server = createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
これは、OSスレッドが使用される今日の一般的な同時実行モデルとは対照的です。スレッドベースのネットワーキングは比較的非効率的で、使用が非常に困難です。さらに、Node.js のユーザーは、ロックがないため、プロセスがデッドロックする心配がありません。Node.js のほとんどの関数は I/O を直接実行しないため、Node.js 標準ライブラリの同期メソッドを使用して I/O が実行される場合を除き、プロセスはブロックされません。何もブロックされないため、スケーラブルなシステムは Node.js で非常に簡単に開発できます。
この言語の一部が分かりにくい場合は、ブロッキングとノンブロッキングの概要に関する完全な記事があります。
Node.js は、Ruby の Event Machine や Python の Twisted などのシステムと設計が似ており、それらの影響を受けています。Node.js はイベントモデルをさらに一歩進めています。ランタイムコンストラクトとしてイベントループを提供し、ライブラリとして提供しません。他のシステムでは、常にイベントループを開始するためのブロッキングコールがあります。通常、動作はスクリプトの先頭でコールバックによって定義され、最後に`EventMachine::run()`のようなブロッキングコールを通じてサーバーが開始されます。Node.js には、そのようなイベントループを開始するコールはありません。Node.js は、入力スクリプトを実行した後、単にイベントループに入ります。Node.js は、実行するコールバックがなくなった場合にイベントループを終了します。この動作はブラウザの JavaScript と似ており、イベントループはユーザーから隠されています。
HTTP は Node.js の第一級市民であり、ストリーミングと低遅延を念頭に置いて設計されています。これにより、Node.js は Web ライブラリまたはフレームワークの基盤として最適です。
Node.js はスレッドなしで設計されていますが、環境内の複数のコアを利用できないわけではありません。child_process.fork()
API を使用して子プロセスを生成でき、通信が容易になるように設計されています。同じインターフェースに基づいて構築されたcluster
モジュールを使用すると、プロセス間でソケットを共有して、コアにわたるロードバランシングを有効にすることができます。