こんにちは、Habrの読者の皆さん! この記事は、私がJSの世界を開いたばかりの初心者を対象としています。 Node.jsでサーバーを調査および設計する過程で、開発者は常にアプリケーションを再起動する必要に直面しています。 そして、何人かの人々がプロジェクトに取り組んでいる場合、私たちはかなり難しい仕事をします。
タスクは、サーバーを上げて、たとえば
http://127.0.0.1/habrおよび
http://127.0.0.1/habrahabrなどのいくつかのURLを処理することです。 サーバーは例外を処理する必要があり、プロジェクトは高負荷向けに設計されています。
この記事の目的は、チームワークに便利で初心者にとって理解しやすいホットスワップアプリケーションを作成する方法を理解することです。最初にすることは
、Node.jsでサーバーを上げることです。
var http = require('http'); var file = new static.Server('.'); http.createServer(function(req, res) { file.serve(req, res); }).listen(80);
問題は、サーバーが1つのシステムプロセスでのみ実行されることです。 コードを少し修正し、クラスタリングを追加します。このため、標準の
クラスターモジュールを使用します。
const cluster = require('cluster'); const http = require('http'); const domain = require('domain'); const numCPUs = require('os').cpus().length; if (cluster.isMaster) { for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', function(worker, code, signal){ console.log('worker ' + worker.process.pid +' died'); cluster.fork(); }); cluster.on('online', function(worker) { console.log('Worker ' + worker.process.pid + ' is online'); }); } else { http.createServer(function(req, res){
メインサーバーのコードを把握しました。非同期例外ハンドラーを備えたサーバーがあり、URLをクラスタリングして処理しています。 MVCパラダイムを使用しているため、codeigniterを標準として採用しています。 ファイル構造は次のとおりです。

構造の説明:
- app.js-メインアプリケーションコード
- core-アプリケーションカーネルファイル、ライブラリ、モジュールなどを含む必要があります。
- アプリケーション-アプリケーションフォルダー
- controller-コントローラーを含むフォルダー
- モデル-モデルのあるフォルダー
- モデル-ビュー付きフォルダー
- route.json-ユーザールーティング
コントローラーのコード処理が必要です。 この問題を解決するには、いくつかの方法があります。
- require-この出版物は考慮されません。
- evalはvmよりも数倍遅く動作するため、推奨される方法ではありませんが、最も安全な方法ではありません
- vmは、コードがサンドボックスでコンパイルされる仮想マシンです。 この方法の利点は、リークや作業の問題が発生した場合、プロセス全体を破壊することはできず、サンドボックス内のプロセスのみを破壊できることですが、これは別の記事です。
ドキュメントから、vmはコンテキストで実行されることがわかります。新しいコンテキストで実行することも、現在のコンテキストで実行することもできます。 最も正しい解決策は、新しいコンテキストでコードを実行することです。
完全なサンプルコード:
const cluster = require('cluster'); const http = require('http'); const domain = require('domain'); const numCPUs = require('os').cpus().length; if (cluster.isMaster) { for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', function(worker, code, signal){ console.log('worker ' + worker.process.pid +' died'); cluster.fork(); }); cluster.on('online', function(worker) { console.log('Worker ' + worker.process.pid + ' is online'); }); } else { http.createServer(function(req, res){
コントローラーコードの例:
res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Headers', 'origin, content-type, accept'); res.setHeader("Cache-Control", "no-cache, must-revalidate"); res.writeHead(200, {"Content-Type": "text/plain"}); res.write('CONTROLLER RUN'); res.end();
したがって、メインアプリケーションを再起動せずにコードをダウンロードして実行する(サンドボックス内のコードを実行する)アプリケーションフレームワークがあります。
このソリューションは、大規模アプリケーションのチーム開発に最適です。 この記事では、Node.jsのクラスターとvmドメインを調べました。
参照:
- learn.javascript.ru/ajax-nodejs
- nodejs.org/api/cluster.html
- en.wikipedia.org/wiki/Model-View-Controller
- code-igniter.ru/user_guide/libraries/uri.html
- en.wikipedia.org/wiki/JSON
- nodejs.org/api/domain.html
- nodejs.org/api/vm.html
- https://github.com/pan-alexey/nodeigniter-github sources