Node.JS:Web Workersを使用したpreforkモードのHTTPサーバーの例

前に約束したように、 Web Workersと新しいnet.Server.listenFD()



APIを使用してnet.Server.listenFD()



モードでHTTPサーバーを構築する方法を示すソースコードを公開しています。 このコードが、ファイル記述子とWeb Workers転送を組み合わせることにより、複数のサーバーコアを簡単にロードできることの良い例になることを願っています。



master.jsでは、ポート8080に接続されたソケットを作成し、リクエストを処理する4つのワークフローを生成します。 要求に対するすべての応答に使用する必要があるテキストと、ソケットのファイル記述子を含むメッセージを各ハンドラーに送信します。



  1. var path = require 'path' ;
  2. var netBindings =プロセス。 バインディング 「ネット」 ;
  3. var Worker = require 'webworker' 労働者
  4. var fd = netBindings。 ソケット 'tcp4' ;
  5. netBindings。 バインド fd 8080 ;
  6. netBindings。 聞く fd 128 ;
  7. for var i = 0 ; i < 3 ; i ++ {
  8. var w = new Worker path。join __dirname 'worker.js' ;
  9. w。 postMessage { 'banner' 'Hello、world!' } fd ;
  10. }




worker.jsでは、HTTPサーバーをインスタンス化しますが、 listen()



呼び出しません。 代わりに、親プロセスからのメッセージが受け入れられることを期待しています。 イベントを受信すると、メッセージからファイル記述子を取得し、それを使用してhttp.Serverインスタンスをソケットにバインドします。 http.Server.listenFD()



が呼び出されるとすぐに、このプロセスはリクエストの処理を開始します。



  1. var assert = require 'assert' ;
  2. var http = require 'http' ;
  3. var banner = undefined ;
  4. var srv = http。 createServer function req resp {
  5. それぞれ writeHead 200 { 'Content-Type' 'text / plain' } ;
  6. それぞれ write banner + '(pid' + process。pid + ') \ n ' ;
  7. それぞれ 終了 ;
  8. } ;
  9. onmessage = function msg {
  10. アサートします。 ok msg。fd && msg。fd > 0 ;
  11. banner = msg。 データ バナー ;
  12. srv。 listenFD msg。fd ;
  13. } ;




master.jsを実行すると、curlを使用して、リクエストが異なるプロセスで処理されたことを確認できます。



  1. %curl 'http:// localhost:8080'
  2. こんにちは世界! (pid 27727)
  3. %curl 'http:// localhost:8080'
  4. こんにちは世界! (pid 27728)
  5. %curl 'http:// localhost:8080'
  6. こんにちは世界! (pid 27729)
  7. %curl 'http:// localhost:8080'
  8. こんにちは世界! (pid 27727)




とても簡単です。



All Articles