前に約束したように、
Web Workersと新しい
net.Server.listenFD()
APIを使用して
net.Server.listenFD()
モードでHTTPサーバーを構築する方法を示すソースコードを公開しています。 このコードが、ファイル記述子とWeb Workers転送を組み合わせることにより、複数のサーバーコアを簡単にロードできることの良い例になることを願っています。
master.jsでは、ポート8080に接続されたソケットを作成し、リクエストを処理する4つのワークフローを生成します。 要求に対するすべての応答に使用する必要があるテキストと、ソケットのファイル記述子を含むメッセージを各ハンドラーに送信します。
- var path = require ( 'path' ) ;
- var netBindings =プロセス。 バインディング ( 「ネット」 ) ;
- var Worker = require ( 'webworker' ) 。 労働者
- var fd = netBindings。 ソケット ( 'tcp4' ) ;
- netBindings。 バインド ( fd 、 8080 ) ;
- netBindings。 聞く ( fd 、 128 ) ;
- for ( var i = 0 ; i < 3 ; i ++ ) {
- var w = new Worker ( path。join ( __dirname 、 'worker.js' ) ) ;
- w。 postMessage ( { 'banner' : 'Hello、world!' } 、 fd ) ;
- }
worker.jsでは、HTTPサーバーをインスタンス化しますが、
listen()
呼び出しません。 代わりに、親プロセスからのメッセージが受け入れられることを期待しています。 イベントを受信すると、メッセージからファイル記述子を取得し、それを使用してhttp.Serverインスタンスをソケットにバインドします。
http.Server.listenFD()
が呼び出されるとすぐに、このプロセスはリクエストの処理を開始します。
- var assert = require ( 'assert' ) ;
- var http = require ( 'http' ) ;
- var banner = undefined ;
- var srv = http。 createServer ( function ( req 、 resp ) {
- それぞれ writeHead ( 200 、 { 'Content-Type' : 'text / plain' } ) ;
- それぞれ write ( banner + '(pid' + process。pid + ') \ n ' ) ;
- それぞれ 終了 ( ) ;
- } ) ;
- onmessage = function ( msg ) {
- アサートします。 ok ( msg。fd && msg。fd > 0 ) ;
- banner = msg。 データ バナー ;
- srv。 listenFD ( msg。fd ) ;
- } ;
master.jsを実行すると、curlを使用して、リクエストが異なるプロセスで処理されたことを確認できます。
- %curl 'http:// localhost:8080'
- こんにちは世界! (pid 27727)
- %curl 'http:// localhost:8080'
- こんにちは世界! (pid 27728)
- %curl 'http:// localhost:8080'
- こんにちは世界! (pid 27729)
- %curl 'http:// localhost:8080'
- こんにちは世界! (pid 27727)
とても簡単です。