コアポイント
- node.jsは、イベント駆動型アーキテクチャと非ブロッキングI/O APIを備えた高トラフィックWebサイトを処理するための一般的なサーバー側(cè)の実行環(huán)境になり、非同期リクエスト処理を可能にします。
- node.jsのスケーラビリティは、大企業(yè)が採用する重要な機能です。デフォルトで単一のスレッドで実行され、メモリ制限がありますが、node.jsはクラスターモジュールを介してアプリケーションを拡張して、単一のプロセスを複數(shù)のプロセスまたはワーカープロセスに分割できます。
- node.jsクラスターモジュールは、同じnode.jsプロセスを複數(shù)回実行して動作します。これにより、メインプロセスを特定し、サーバーのハンドルを共有して親ノードプロセスと通信できるワーカープロセスを作成できます。
- node.jsアプリケーションは、クラスターモジュールを使用して並列化でき、複數(shù)のプロセスを同時に実行できるようにします。これにより、システムの効率が向上し、アプリケーションのパフォーマンスが向上し、信頼性と稼働時間が向上します。
- node.jsクラスターモジュールは主にWebサーバーに推奨されますが、ワーカープロセスとワーカープロセスとメインプロセス間の効果的な通信を慎重に検討する場合も、他のアプリケーションにも使用できます。
node.jsは、特に交通量の多いウェブサイトで、サーバー側(cè)の実行環(huán)境としてますます人気が高まっており、統(tǒng)計もこれを証明しています。さらに、多數(shù)のフレームワークが利用できるため、迅速なプロトタイピングに適した環(huán)境になります。 node.jsには、非ブロッキングI/O APIを使用してリクエストの非同期処理を可能にするイベント駆動型アーキテクチャがあります。 node.jsの重要でしばしば見落とされがちな機能は、そのスケーラビリティです。実際、これがいくつかの大企業(yè)がnode.js(Microsoft、Yahoo、Uber、Walmartなど)をプラットフォームに統(tǒng)合し、サーバー側(cè)の操作を完全にNode.js(Paypal、ebayなどに完全に移行する主な理由です。 、およびGroupon)。各node.jsプロセスは単一のスレッドで実行されます。デフォルトでは、32ビットシステムのメモリ制限は512MBで、64ビットシステムのメモリ制限は1GBです。メモリ制限は、32ビットシステムで約1GBに増加し、64ビットシステムで約1.7GBに増加させることができますが、メモリと処理能力は依然としてさまざまなプロセスのボトルネックになります。 node.jsが拡張アプリケーションに提供するエレガントなソリューションは、node.js用語の複數(shù)のプロセスまたはワーカープロセスに単一のプロセスを分割することです。これは、クラスターモジュールを介して実現(xiàn)できます。クラスターモジュールを使用すると、すべてのサーバーポートをメインノードプロセス(メインプロセス)と共有する子プロセス(作業(yè)プロセス)を作成できます。この記事では、node.jsクラスターを作成してアプリケーションを高速化する方法を?qū)Wびます。 クラスターは、親ノードプロセスの下で実行される同様のワーカープロセスのプールです。ワーカープロセスは、child_processesモジュールのfork()メソッドを使用して生成されます。これは、ワーカープロセスがサーバーのハンドルを共有し、IPC(インタープロセス通信)を使用して親ノードプロセスと通信できることを意味します。主なプロセスは、作業(yè)プロセスの開始と制御を擔(dān)當(dāng)します。メインプロセスで好きなだけ多くのワーカープロセスを作成できます。また、デフォルトでは、入ってくる接続が労働者プロセス(Windowsを除く)間でポーリングが割り當(dāng)てられることを忘れないでください。実際、著信接続を割り當(dāng)てる別の方法がありますが、ここでは議論しません。オペレーティングシステム(Windowsのデフォルト設(shè)定)への割り當(dāng)てを引き渡します。 node.jsドキュメントでは、デフォルトのポーリングスタイルをスケジューリングポリシーとして使用することをお勧めします。クラスターモジュールを使用することは理論的には複雑に聞こえますが、その実裝は非常に簡単です。使用を開始するには、node.jsアプリケーションに含める必要があります。
このセクションには2つの例が含まれています。最初の例は、node.jsアプリケーションでクラスターモジュールを使用する方法を示す簡単なアプリケーションです。 2番目の例は、node.jsクラスターモジュールを利用するExpressサーバーです。これは、通常、大規(guī)模なプロジェクトで使用する本番コードの一部です。どちらの例もGithubからダウンロードできます。
この最初の例では、リクエストを処理するワーカープロセスIDを含むメッセージを使用して、すべての著信要求に応答する簡単なサーバーを設(shè)定します。主なプロセスは、4つのワーカープロセスを?qū)Г訾筏蓼?。各労働者プロセスでは、ポート8000??を聴き始めて、著信リクエストを受け取ります。私が今説明したことを?qū)g裝するコードは次のとおりです。
Expressは、node.jsの最も人気のあるWebアプリケーションフレームワークの1つです(最も人気がない場合)。このウェブサイトで何度かカバーしました。もっと學(xué)習(xí)することに興味がある場合は、「Express 4を使用してRestful APIの作成」と「node.js駆動型チャットルームWebアプリケーション:Express and Azure」を読むことをお勧めします。 2番目の例は、高度にスケーラブルなExpressサーバーを開発する方法を示しています。また、単一のプロセスサーバーを移行して、少量のコードを使用してクラスターモジュールを利用する方法も示しています。 この例への最初の追加は、node.js OSモジュールを使用してCPUコアの數(shù)を取得することです。 OSモジュールには、CPUコアの配列を返すCPUS()関數(shù)が含まれています。このアプローチを使用して、リソースの使用を最大化するために、サーバー仕様に基づいて導(dǎo)出するワーカープロセスの數(shù)を動的に決定できます。 2番目のより重要な追加は、作業(yè)プロセスの死に対処することです。ワーカープロセスが死ぬと、クラスターモジュールは出口イベントを発行します。イベントをリッスンし、放出されたときにコールバック関數(shù)を?qū)g行することで処理できます。これを行うには、cluster.on( 'exit'、callback)などのステートメントを書くことでできます。コールバック関數(shù)では、予想される労働者プロセスを維持するために新しいワーカープロセスを?qū)Г訾筏蓼埂¥长欷摔瑜?、未解決の例外がある場合でも、アプリケーションを?qū)g行し続けることができます。この例では、オンラインイベントのリスナーも設(shè)定します。これは、労働者のプロセスが導(dǎo)き出され、著信リクエストを受信する準(zhǔn)備ができているときはいつでも放出されます。これは、ロギングまたはその他の操作に使用できます。 APIをベンチマークするツールがいくつかありますが、ここではApacheベンチマークツールを使用して、クラスターモジュールの使用がアプリケーションのパフォーマンスにどのように影響するかを分析します。テストをセットアップするために、そのルートのルートとコールバック関數(shù)を備えたExpressサーバーを開発しました。コールバック関數(shù)で、仮想操作を?qū)g行し、短いメッセージを返します。サーバーには2つのバージョンがあります。1つはワーカープロセスがなく、すべての操作がメインプロセスで行われ、もう1つは8つのワーカープロセスがあります(マシンには8つのコアがあるため)。次の表は、マージクラスターモジュールが毎秒処理されるリクエストの數(shù)をどのように増やすかを示しています。 (1秒あたりの処理されたリクエストの數(shù)) 高度な操作 クラスターモジュールの使用は比較的簡単ですが、ワーカープロセスを使用して他の操作を?qū)g行できます。たとえば、クラスターモジュールを使用して、アプリケーションのゼロダウンタイムを(ほぼ?。━讥恁昆Ε螗骏ぅ啶?qū)g現(xiàn)できます。しばらくの間、これらの操作のいくつかを行う方法を?qū)Wびます。
同様に、メインプロセスにメッセージを送信するには、次のことを書くことができます。
ゼロダウンタイム
クラスターモジュール內(nèi)のワーカーオブジェクトから、すべての実行中のワーカープロセスのIDを取得できます。このオブジェクトは、ワーカープロセスが終了および再起動されると、すべての実行中のワーカープロセスと動的に更新されることへの參照を保持します。最初に、WorkerIDSアレイにすべての実行中のワーカープロセスのIDを保存します。このようにして、新たに派生した労働者プロセスの再起動を避けます。次に、各労働者のプロセスを安全に閉鎖するように要求します。労働者のプロセスが5秒後も実行されていて、労働者のオブジェクトに存在する場合、労働者プロセスのキル機能を呼び出して、それを強制的に閉じます。 GitHubで実用的な例を見つけることができます。 結(jié)論 node.jsアプリケーションは、クラスターモジュールを使用して並列化して、システムをより効率的に使用できるようにすることができます。複數(shù)のプロセスを同時に実行できます。これにより、node.jsが難しい部品を処理するため、移行が比較的簡単になります。パフォーマンスの比較で実証したように、システムリソースをより効率的に活用することにより、アプリケーションのパフォーマンスを大幅に改善することができます。パフォーマンスに加えて、アプリケーションの実行中にワーカープロセスを再起動することにより、アプリケーションの信頼性と稼働時間を改善できます。つまり、アプリケーションでクラスターモジュールを使用することを検討する際には注意する必要があります。クラスターモジュールの主な推奨使用は、Webサーバー用です。それ以外の場合は、労働者プロセス間にタスクを割り當(dāng)てる方法と、ワーカープロセスとメインプロセス間で進歩を効果的に伝える方法を詳しく調(diào)べる必要があります。 Webサーバーであっても、単一のnode.jsプロセスが、変更がエラーを?qū)毪工肟赡苄预ⅳ毪郡帷ⅴⅴ抓辚暴`ションに変更を加える前にボトルネック(メモリまたはCPU)であることを確認してください。最後になりましたが、node.jsのWebサイトは、クラスターモジュールの優(yōu)れたドキュメントを提供しています。必ずチェックしてください! に関する node.jsクラスターを使用することの主な利點は、アプリケーションのパフォーマンスを改善することです。 node.jsはスレッドで実行されます。つまり、一度に1つのCPUコアのみを使用できることを意味します。ただし、最新のサーバーには通常、複數(shù)のコアがあります。 node.jsクラスターを使用することにより、それぞれが異なるCPUコアで実行されている複數(shù)のワーカープロセスを?qū)С訾工毳幞ぅ螗抓恁互工蜃鞒嗓扦蓼?。これにより、アプリケーションはより多くの要求を同時に処理できるようになり、速度とパフォーマンスが大幅に向上します。 node.jsクラスターは、複數(shù)のワーカープロセスを?qū)С訾工毳幞ぅ螗抓恁互工蜃鞒嗓工毪长趣菣C能します。主なプロセスは、著信要求のために耳を傾け、投票方法でそれらを労働者プロセスに配布します。各ワーカープロセスは、個別のCPUコアで実行され、リクエストを個別に処理します。これにより、アプリケーションは利用可能なすべてのCPUコアを利用して、同時により多くのリクエストを処理できます。 node.jsクラスターの作成には、node.jsが提供する「クラスター」モジュールの使用が含まれます。まず、「クラスター」と「OS」モジュールをインポートする必要があります。その後、「cluster.fork()」メソッドを使用して、ワーカープロセスを作成できます。 「OS.CPUS()。長さ」は、利用可能なCPUコアの數(shù)を提供します。これを使用して、作成するワーカープロセスの數(shù)を決定できます。簡単な例を次に示します: メインプロセスで「終了」イベントをリッスンすることにより、node.jsクラスターのワーカープロセスクラッシュを処理できます。ワーカープロセスがクラッシュすると、メインプロセスに「終了」イベントを送信します。その後、「cluster.fork()」メソッドを使用して、クラッシュしたワーカープロセスを置き換える新しいワーカープロセスを作成できます。例は次のとおりです。 はい、Express.jsでnode.jsクラスターを使用できます。実際、node.jsクラスタリングを使用すると、Express.jsアプリケーションのパフォーマンスが大幅に向上する可能性があります。 ClusterスクリプトのWorkerプロセスコードブロックにExpress.jsアプリケーションコードを配置するだけです。 node.jsクラスターはアプリケーションのパフォーマンスを大幅に改善できますが、いくつかの制限もあります。たとえば、労働者のプロセスは狀態(tài)や記憶を共有しません。これは、すべてのワーカープロセスでアクセスできないため、セッションデータをメモリに保存できないことを意味します。代わりに、データベースやRedisサーバーなどの共有セッションストレージを使用する必要があります。 デフォルトでは、node.jsクラスターの主なプロセスは、ポーリング方法で入っているリクエストを労働者プロセスに配布します。これにより、基本的な形式の負荷分散が提供されます。ただし、より高度なロードバランシングが必要な場合は、Nginxなどの逆プロキシサーバーを使用する必要がある場合があります。 はい、生産環(huán)境でnode.jsクラスターを使用できます。実際、生産環(huán)境でnode.jsクラスターを使用して、サーバーのCPUコアを最大限に活用し、アプリケーションのパフォーマンスを向上させることを強くお勧めします。 node.jsクラスターのデバッグは、複數(shù)のワーカープロセスが同時に実行されているため、少し難しい場合があります。ただし、各ワーカープロセスに一意のポートを使用して、「検査」フラグを使用して各プロセスにデバッガーを添付できます。例は次のとおりです。 はい、他のnode.jsモジュールでnode.jsクラスターを使用できます。ただし、労働者のプロセスは狀態(tài)やメモリを共有していないことに注意する必要があります。これは、モジュールが共有狀態(tài)に依存している場合、クラスター環(huán)境では適切に機能しない可能性があることを意味します。 node.jsクラスターモジュール:それは何をし、どのように機能するか
var cluster = require('cluster');
クラスターモジュールは、同じnode.jsプロセスを複數(shù)回実行します。したがって、最初に行う必要があるのは、メインプロセスに使用されるコードのどの部分と、ワーカープロセスにどの部分が使用されるかを決定することです。クラスターモジュールを使用すると、メインプロセスを次のように識別できます。
if(cluster.isMaster) { ... }
cluster.fork();
例サーバー(コマンドノードSimple.jsを?qū)g行する)を起動し、URL
http://miracleart.cn/link/link/link/link/link/link/link/link/link/link/link/link/link/link/link/link/link/link/linkにアクセスして、URLにアクセスできます。 高度にスケーラブルなExpressサーバーを開発する方法
var cluster = require('cluster');
パフォーマンスの比較
并發(fā)連接
1
2
4
8
16
單進程
654
711
783
776
754
8個工作進程
594
1198
2110
3010
3024
時々、メインプロセスからメッセージをワーカープロセスに送信して、タスクを割り當(dāng)てたり、他のアクションを?qū)g行したりする必要がある場合があります。その見返りに、労働者プロセスは、タスクが完了したことを主なプロセスに通知する必要がある場合があります。メッセージを聞くには、メインプロセスとワーカープロセスの両方でメッセージイベントのイベントリスナーを設(shè)定する必要があります。
var cluster = require('cluster');
if(cluster.isMaster) { ... }
cluster.fork();
var cluster = require('cluster');
var http = require('http');
var numCPUs = 4;
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
http.createServer(function(req, res) {
res.writeHead(200);
res.end('process ' + process.pid + ' says hello!');
}).listen(8000);
}
var cluster = require('cluster');
if(cluster.isMaster) {
var numWorkers = require('os').cpus().length;
console.log('Master cluster setting up ' + numWorkers + ' workers...');
for(var i = 0; i < numWorkers; i++) {
cluster.fork();
}
cluster.on('online', function(worker) {
console.log('Worker ' + worker.process.pid + ' is online');
});
cluster.on('exit', function(worker, code, signal) {
console.log('Worker ' + worker.process.pid + ' died with code: ' + code + ', and signal: ' + signal);
console.log('Starting a new worker');
cluster.fork();
});
} else {
var app = require('express')();
app.all('/*', function(req, res) {res.send('process ' + process.pid + ' says hello!').end();})
var server = app.listen(8000, function() {
console.log('Process ' + process.pid + ' is listening to all incoming requests');
});
}
ワーカープロセスを使用して達成できる重要な結(jié)果の1つは、(ほぼ)ゼロダウンタイムサーバーです。主なプロセスでは、アプリケーションを変更した後、ワーカープロセスを1つずつ終了および再起動できます。これにより、新しいバージョンのロード中に古いバージョンを?qū)g行できます。実行時にアプリケーションを再起動できるようにするには、2つのことを覚えておく必要があります。まず、主なプロセスは常に実行され、労働者プロセスのみが終了して再起動されます。したがって、メインプロセスを短く保ち、作業(yè)プロセスのみを管理することが重要です。第二に、労働者のプロセスを再開する必要があることを、どういうわけか主なプロセスに通知する必要があります。これを行うには、ユーザーの入力や監(jiān)視ファイルの変更など、いくつかの方法があります。後者はより効率的ですが、メインプロセスで監(jiān)視するファイルを識別する必要があります。ワーカープロセスを再起動することをお勧めします。以下に示すように、ワーカープロセスにシャットダウンメッセージを送信して、前者を?qū)g行できます。
すべてのワーカープロセスに対してこれを行うには、クラスターモジュールの労働者プロパティを使用できます。これは、すべての実行中のワーカープロセスへの參照を保持します。また、すべてのワーカープロセスを再起動するときに呼び出すことができるメインプロセスの関數(shù)ですべてのタスクをラップすることもできます。 var cluster = require('cluster');
node.jsクラスターを使用することの主な利點は何ですか?
node.jsクラスターはどのように機能しますか?
node.jsクラスターを作成する方法は?
var cluster = require('cluster');
node.jsクラスターでワーカープロセスのクラッシュに対処する方法は?
if(cluster.isMaster) { ... }
Express.jsでnode.jsクラスターを使用できますか?
node.jsクラスターの制限は何ですか?
node.jsクラスターにバランスリクエストをロードする方法は?
制作でnode.jsクラスターを使用できますか?
node.jsクラスターをデバッグする方法は?
cluster.fork();
他のnode.jsモジュールでnode.jsクラスターを使用できますか?
以上がアプリをスピードアップするためのnode.jsクラスターを作成する方法の詳細內(nèi)容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國語版
中國語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











JavaとJavaScriptは異なるプログラミング言語であり、それぞれ異なるアプリケーションシナリオに適しています。 Javaは大規(guī)模なエンタープライズおよびモバイルアプリケーション開発に使用されますが、JavaScriptは主にWebページ開発に使用されます。

ContureCrucialInjavascript formantaining andFosteringCollaboration.1)TheypindeBugging、Onboarding、およびUnderstandingCodeevolution.2)usesingle-linecomments for quickexplanations andmulti-linecomments fordeTeTaileddespransions.3)BestPractsinclud

JavaScriptcommentsEareEssentialential-formaining、およびGuidingCodeexecution.1)single-linecommentseared forquickexplanations.2)多LinecommentsexplaincomplexlogiCorprovidededocumentation.3)clarifyspartsofcode.bestpractic

javascripthasseveralprimitivedatypes:number、string、boolean、undefined、null、symbol、andbigint、andnon-primitiveTypeslike objectandarray

javascriptispreferredforwebdevelopment、whilejavaisbetterforlge-scalebackendsystemsandroidapps.1)javascriptexcelsininintingtivewebexperiences withitsdynAmicnature anddommanipulation.2)javaofferstruntypyping-dobject-reientedpeatures

JavaScriptで日付と時間を処理する場合は、次の點に注意する必要があります。1。日付オブジェクトを作成するには多くの方法があります。 ISO形式の文字列を使用して、互換性を確保することをお勧めします。 2。時間情報を取得および設(shè)定して、メソッドを設(shè)定でき、月は0から始まることに注意してください。 3.手動でのフォーマット日付には文字列が必要であり、サードパーティライブラリも使用できます。 4.ルクソンなどのタイムゾーンをサポートするライブラリを使用することをお勧めします。これらの重要なポイントを習(xí)得すると、一般的な間違いを効果的に回避できます。

javascripthassevenfundamentaldatypes:number、string、boolean、undefined、null、object、andsymbol.1)numberseadouble-precisionformat、有用であるため、有用性の高いものであるため、but-for-loating-pointarithmetic.2)ストリングリムムット、使用率が有用であること

PLACSTHETTHETTHE BOTTOMOFABLOGPOSTORWEBPAGESERVESPAGESPORCICALPURPOSESESFORSEO、userexperience、andDesign.1.IthelpswithiobyAllowingseNStoAccessKeysword-relevanttagwithtagwithtagwithtagwithemaincontent.2.iTimrovesexperiencebyepingepintepepinedeeping
