国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
Node.js集群模塊:它是做什么的以及如何工作
如何在Node.js應用程序中使用集群模塊
如何開發(fā)高度可擴展的Express服務器
性能比較
主進程和工作進程之間的通信
零停機時間
使用Node.js集群的主要優(yōu)勢是什么?
Node.js集群是如何工作的?
如何創(chuàng)建一個Node.js集群?
如何處理Node.js集群中的工作進程崩潰?
我可以將Node.js集群與Express.js一起使用嗎?
Node.js集群的局限性是什么?
如何在Node.js集群中負載均衡請求?
我可以在生產(chǎn)環(huán)境中使用Node.js集群嗎?
如何調(diào)試Node.js集群?
我可以將Node.js集群與其他Node.js模塊一起使用嗎?
首頁 web前端 js教程 如何創(chuàng)建一個node.js群集以加速您的應用

如何創(chuàng)建一個node.js群集以加速您的應用

Feb 19, 2025 pm 12:01 PM

How to Create a Node.js Cluster for Speeding Up Your Apps

核心要點

  • Node.js憑借其事件驅(qū)動架構(gòu)和非阻塞I/O API,成為處理高流量網(wǎng)站的熱門服務器端運行環(huán)境,允許異步請求處理。
  • Node.js的可擴展性是其被大型公司采用的關鍵特性。盡管默認情況下在單線程中運行并具有內(nèi)存限制,但Node.js可以通過集群模塊將單個進程拆分為多個進程或工作進程來擴展應用程序。
  • Node.js集群模塊通過多次執(zhí)行相同的Node.js進程來工作。它允許識別主進程并創(chuàng)建工作進程,這些工作進程可以共享服務器句柄并與父Node進程通信。
  • Node.js應用程序可以使用集群模塊進行并行化,允許多個進程同時運行。這提高了系統(tǒng)的效率,改善了應用程序性能,并增強了可靠性和正常運行時間。
  • 雖然Node.js集群模塊主要推薦用于Web服務器,但在仔細考慮工作進程之間的任務分配以及工作進程和主進程之間的有效通信的情況下,也可以將其用于其他應用程序。

Node.js作為服務器端運行環(huán)境越來越受歡迎,尤其是在高流量網(wǎng)站方面,統(tǒng)計數(shù)據(jù)也證明了這一點。此外,眾多框架的可用性使其成為快速原型設計的良好環(huán)境。Node.js具有事件驅(qū)動的架構(gòu),利用非阻塞I/O API允許異步處理請求。Node.js的一個重要且經(jīng)常被忽視的特性是其可擴展性。事實上,這是某些大型公司在其平臺中集成Node.js(例如Microsoft、Yahoo、Uber和Walmart)甚至將其服務器端操作完全遷移到Node.js(例如PayPal、eBay和Groupon)的主要原因。每個Node.js進程都在單個線程中運行,默認情況下,32位系統(tǒng)的內(nèi)存限制為512MB,64位系統(tǒng)的內(nèi)存限制為1GB。盡管可以在32位系統(tǒng)上將內(nèi)存限制提高到約1GB,在64位系統(tǒng)上提高到約1.7GB,但內(nèi)存和處理能力仍然可能成為各種進程的瓶頸。Node.js為擴展應用程序提供的優(yōu)雅解決方案是將單個進程拆分為多個進程或Node.js術語中的工作進程。這可以通過集群模塊實現(xiàn)。集群模塊允許您創(chuàng)建子進程(工作進程),這些子進程與主Node進程(主進程)共享所有服務器端口。在本文中,您將了解如何創(chuàng)建Node.js集群以加快應用程序的速度。

Node.js集群模塊:它是做什么的以及如何工作

集群是在父Node進程下運行的類似工作進程的池。工作進程使用child_processes模塊的fork()方法生成。這意味著工作進程可以共享服務器句柄并使用IPC(進程間通信)與父Node進程通信。主進程負責啟動和控制工作進程。您可以在主進程中創(chuàng)建任意數(shù)量的工作進程。此外,請記住,默認情況下,傳入連接在工作進程之間以輪詢方式分配(Windows除外)。實際上,還有另一種分配傳入連接的方法,這里我不會討論,它將分配交給操作系統(tǒng)(Windows中的默認設置)。Node.js文檔建議使用默認的輪詢樣式作為調(diào)度策略。盡管從理論上講,使用集群模塊聽起來很復雜,但其實現(xiàn)非常簡單。要開始使用它,您必須將其包含在您的Node.js應用程序中:

var cluster = require('cluster');

集群模塊多次執(zhí)行相同的Node.js進程。因此,您需要做的第一件事是確定哪一部分代碼用于主進程,哪一部分代碼用于工作進程。集群模塊允許您如下識別主進程:

if(cluster.isMaster) { ... }

主進程是您啟動的進程,它又會初始化工作進程。要在主進程中啟動工作進程,我們將使用fork()方法:

cluster.fork();

此方法返回一個worker對象,其中包含有關已派生的worker的一些方法和屬性。我們將在下一節(jié)中看到一些示例。集群模塊包含多個事件。與工作進程啟動和終止時刻相關的兩個常見事件是online和exit事件。當工作進程派生并發(fā)送online消息時,會發(fā)出online事件。當工作進程死亡時,會發(fā)出exit事件。稍后,我們將了解如何使用這兩個事件來控制工作進程的生命周期?,F(xiàn)在,讓我們將到目前為止看到的所有內(nèi)容放在一起,并展示一個完整的可運行示例。

示例

本節(jié)包含兩個示例。第一個示例是一個簡單的應用程序,顯示如何在Node.js應用程序中使用集群模塊。第二個示例是一個利用Node.js集群模塊的Express服務器,它是我通常在大規(guī)模項目中使用的生產(chǎn)代碼的一部分。這兩個示例都可以從GitHub下載。

如何在Node.js應用程序中使用集群模塊

在這個第一個示例中,我們設置了一個簡單的服務器,它使用包含處理請求的工作進程ID的消息來響應所有傳入請求。主進程派生四個工作進程。在每個工作進程中,我們開始監(jiān)聽端口8000以接收傳入請求。實現(xiàn)我剛才描述的內(nèi)容的代碼如下所示:

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);
}

您可以通過啟動服務器(運行命令node simple.js)并訪問URL http://m.miracleart.cn/link/7d2d180c45c41870f36e747816456190

如何開發(fā)高度可擴展的Express服務器

Express是Node.js最流行的Web應用程序框架之一(如果不是最流行的話)。在本網(wǎng)站上,我們已經(jīng)多次介紹過它。如果您有興趣了解更多信息,我建議您閱讀文章《使用Express 4創(chuàng)建RESTful API》和《構(gòu)建Node.js驅(qū)動的聊天室Web應用程序:Express和Azure》。第二個示例顯示了如何開發(fā)高度可擴展的Express服務器。它還演示了如何遷移單個進程服務器以利用少量代碼的集群模塊。

var cluster = require('cluster');

此示例的第一個補充是使用Node.js os模塊獲取CPU內(nèi)核的數(shù)量。os模塊包含一個cpus()函數(shù),它返回一個CPU內(nèi)核數(shù)組。使用這種方法,我們可以根據(jù)服務器規(guī)格動態(tài)確定要派生的工作進程數(shù)量,以最大限度地利用資源。第二個更重要的補充是處理工作進程的死亡。當工作進程死亡時,集群模塊會發(fā)出exit事件??梢酝ㄟ^偵聽該事件并在發(fā)出該事件時執(zhí)行回調(diào)函數(shù)來處理它。您可以通過編寫類似cluster.on('exit', callback);的語句來做到這一點。在回調(diào)函數(shù)中,我們派生一個新的工作進程以保持預期的工作進程數(shù)量。這允許我們保持應用程序運行,即使有一些未處理的異常。在這個示例中,我還為online事件設置了一個偵聽器,每當派生工作進程并準備好接收傳入請求時,就會發(fā)出該事件。這可用于日志記錄或其他操作。

性能比較

有幾種工具可以對API進行基準測試,但這里我使用Apache Benchmark工具來分析使用集群模塊如何影響應用程序的性能。為了設置測試,我開發(fā)了一個Express服務器,它有一個路由和一個用于該路由的回調(diào)函數(shù)。在回調(diào)函數(shù)中,執(zhí)行一個虛擬操作,然后返回一條簡短的消息。服務器有兩個版本:一個沒有工作進程,其中所有操作都在主進程中發(fā)生,另一個有8個工作進程(因為我的機器有8個內(nèi)核)。下表顯示了合并集群模塊如何增加每秒處理的請求數(shù)。

并發(fā)連接 1 2 4 8 16
單進程 654 711 783 776 754
8個工作進程 594 1198 2110 3010 3024

(每秒處理的請求數(shù))

高級操作

雖然使用集群模塊相對簡單,但您可以使用工作進程執(zhí)行其他操作。例如,您可以使用集群模塊實現(xiàn)應用程序的(幾乎?。┝阃C時間。我們過一會兒將了解如何執(zhí)行其中一些操作。

主進程和工作進程之間的通信

有時,您可能需要從主進程向工作進程發(fā)送消息以分配任務或執(zhí)行其他操作。作為回報,工作進程可能需要通知主進程任務已完成。要偵聽消息,應在主進程和工作進程中都設置message事件的事件偵聽器:

var cluster = require('cluster');

worker對象是fork()方法返回的引用。要在工作進程中偵聽來自主進程的消息:

if(cluster.isMaster) { ... }

消息可以是字符串或JSON對象。要向特定工作進程發(fā)送消息,您可以編寫如下所示的代碼:

cluster.fork();

類似地,要向主進程發(fā)送消息,您可以編寫:

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);
}

在Node.js中,消息是通用的,沒有特定類型。因此,最好將消息作為包含有關消息類型、發(fā)送者和內(nèi)容本身的一些信息的JSON對象發(fā)送。例如:

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');
    });
}

這里需要注意的一點是,message事件回調(diào)是異步處理的。沒有定義的執(zhí)行順序。您可以在GitHub上找到主進程和工作進程之間通信的完整示例。

零停機時間

使用工作進程可以實現(xiàn)的一個重要結(jié)果是(幾乎)零停機時間服務器。在主進程中,您可以在對應用程序進行更改后,一次一個地終止和重新啟動工作進程。這允許您在加載新版本的同時運行舊版本。為了能夠在運行時重新啟動應用程序,您需要記住兩點。首先,主進程一直運行,只有工作進程被終止和重新啟動。因此,重要的是要使主進程保持簡短,并且只負責管理工作進程。其次,您需要以某種方式通知主進程需要重新啟動工作進程。有幾種方法可以做到這一點,包括用戶輸入或監(jiān)視文件更改。后者效率更高,但您需要在主進程中識別要監(jiān)視的文件。我建議重新啟動工作進程的方法是首先嘗試安全地關閉它們;然后,如果它們沒有安全終止,則強制殺死它們。您可以通過向工作進程發(fā)送關閉消息來執(zhí)行前者,如下所示:

worker.on('message', function(message) {
    console.log(message);
});

并在工作進程message事件處理程序中啟動安全關閉:

process.on('message', function(message) {
    console.log(message);
});

要對所有工作進程執(zhí)行此操作,您可以使用集群模塊的workers屬性,該屬性保存對所有正在運行的工作進程的引用。我們還可以將所有任務包裝在主進程中的一個函數(shù)中,該函數(shù)可以在我們想要重新啟動所有工作進程時調(diào)用。

var cluster = require('cluster');

我們可以從集群模塊中的workers對象獲取所有正在運行的工作進程的ID。此對象保存對所有正在運行的工作進程的引用,并在終止和重新啟動工作進程時動態(tài)更新。首先,我們將所有正在運行的工作進程的ID存儲在workerIds數(shù)組中。這樣,我們避免重新啟動新派生的工作進程。然后,我們請求每個工作進程安全關閉。如果5秒后工作進程仍在運行并且仍然存在于workers對象中,那么我們調(diào)用工作進程上的kill函數(shù)以強制其關閉。您可以在GitHub上找到一個實際示例。

結(jié)論

可以使用集群模塊對Node.js應用程序進行并行化,以便更有效地使用系統(tǒng)。可以使用幾行代碼同時運行多個進程,這使得遷移相對容易,因為Node.js處理困難的部分。正如我在性能比較中所展示的那樣,通過更有效地利用系統(tǒng)資源,應用程序性能有可能得到顯著提高。除了性能之外,您還可以通過在應用程序運行時重新啟動工作進程來提高應用程序的可靠性和正常運行時間。也就是說,在考慮在應用程序中使用集群模塊時,您需要注意。集群模塊的主要推薦用途是用于Web服務器。在其他情況下,您需要仔細研究如何在工作進程之間分配任務,以及如何在工作進程和主進程之間有效地溝通進度。即使對于Web服務器,在對應用程序進行任何更改之前,也要確保單個Node.js進程是瓶頸(內(nèi)存或CPU),因為您的更改可能會引入錯誤。最后一點,Node.js網(wǎng)站為集群模塊提供了很好的文檔。因此,請務必查看一下!

關于Node.js集群的常見問題解答(FAQ)

使用Node.js集群的主要優(yōu)勢是什么?

使用Node.js集群的主要優(yōu)勢是提高應用程序的性能。 Node.js在一個線程上運行,這意味著它一次只能利用一個CPU內(nèi)核。但是,現(xiàn)代服務器通常有多個內(nèi)核。通過使用Node.js集群,您可以創(chuàng)建一個主進程,該進程派生多個工作進程,每個工作進程都在不同的CPU內(nèi)核上運行。這允許您的應用程序同時處理更多請求,從而顯著提高其速度和性能。

Node.js集群是如何工作的?

Node.js集群通過創(chuàng)建一個主進程來工作,該主進程派生多個工作進程。主進程偵聽傳入請求并將它們以輪詢方式分發(fā)給工作進程。每個工作進程都在單獨的CPU內(nèi)核上運行并獨立處理請求。這允許您的應用程序利用所有可用的CPU內(nèi)核并同時處理更多請求。

如何創(chuàng)建一個Node.js集群?

創(chuàng)建Node.js集群涉及使用Node.js提供的“cluster”模塊。首先,您需要導入“cluster”和“os”模塊。然后,您可以使用“cluster.fork()”方法來創(chuàng)建工作進程。 “os.cpus().length”為您提供可用的CPU內(nèi)核數(shù),您可以使用它來確定要創(chuàng)建的工作進程數(shù)。這是一個簡單的示例:

var cluster = require('cluster');

如何處理Node.js集群中的工作進程崩潰?

您可以通過偵聽主進程上的“exit”事件來處理Node.js集群中的工作進程崩潰。當工作進程崩潰時,它會向主進程發(fā)送“exit”事件。然后,您可以使用“cluster.fork()”方法來創(chuàng)建一個新的工作進程以替換崩潰的工作進程。這是一個示例:

if(cluster.isMaster) { ... }

我可以將Node.js集群與Express.js一起使用嗎?

是的,您可以將Node.js集群與Express.js一起使用。事實上,使用Node.js集群可以顯著提高Express.js應用程序的性能。您只需要將Express.js應用程序代碼放在集群腳本中的工作進程代碼塊中即可。

Node.js集群的局限性是什么?

雖然Node.js集群可以顯著提高應用程序的性能,但它也有一些局限性。例如,工作進程不共享狀態(tài)或內(nèi)存。這意味著您不能將會話數(shù)據(jù)存儲在內(nèi)存中,因為它在所有工作進程中都不可訪問。相反,您需要使用共享會話存儲,例如數(shù)據(jù)庫或Redis服務器。

如何在Node.js集群中負載均衡請求?

默認情況下,Node.js集群中的主進程以輪詢方式將傳入請求分發(fā)給工作進程。這提供了一種基本的負載均衡形式。但是,如果您需要更高級的負載均衡,則可能需要使用反向代理服務器,例如Nginx。

我可以在生產(chǎn)環(huán)境中使用Node.js集群嗎?

是的,您可以在生產(chǎn)環(huán)境中使用Node.js集群。事實上,強烈建議在生產(chǎn)環(huán)境中使用Node.js集群,以充分利用服務器的CPU內(nèi)核并提高應用程序的性能。

如何調(diào)試Node.js集群?

調(diào)試Node.js集群可能有點棘手,因為您有多個工作進程同時運行。但是,您可以對每個工作進程使用具有唯一端口的“inspect”標志來將調(diào)試器附加到每個進程。這是一個示例:

cluster.fork();

我可以將Node.js集群與其他Node.js模塊一起使用嗎?

是的,您可以將Node.js集群與其他Node.js模塊一起使用。但是,您需要注意的是,工作進程不共享狀態(tài)或內(nèi)存。這意味著如果模塊依賴于共享狀態(tài),它可能無法在集群環(huán)境中正常工作。

以上是如何創(chuàng)建一個node.js群集以加速您的應用的詳細內(nèi)容。更多信息請關注PHP中文網(wǎng)其他相關文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語言,各自適用于不同的應用場景。Java用于大型企業(yè)和移動應用開發(fā),而JavaScript主要用于網(wǎng)頁開發(fā)。

JavaScript評論:簡短說明 JavaScript評論:簡短說明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時間合作? 如何在JS中與日期和時間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時間處理需注意以下幾點:1.創(chuàng)建Date對象有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設置時間信息可用get和set方法,注意月份從0開始;3.手動格式化日期需拼接字符串,也可使用第三方庫;4.處理時區(qū)問題建議使用支持時區(qū)的庫,如Luxon。掌握這些要點能有效避免常見錯誤。

JavaScript與Java:開發(fā)人員的全面比較 JavaScript與Java:開發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

為什么要將標簽放在的底部? 為什么要將標簽放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript:探索用于高效編碼的數(shù)據(jù)類型 JavaScript:探索用于高效編碼的數(shù)據(jù)類型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

什么是在DOM中冒泡和捕獲的事件? 什么是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個階段,捕獲是從頂層向下到目標元素,冒泡是從目標元素向上傳播到頂層。1.事件捕獲通過addEventListener的useCapture參數(shù)設為true實現(xiàn);2.事件冒泡是默認行為,useCapture設為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委托,提高動態(tài)內(nèi)容處理效率;5.捕獲可用于提前攔截事件,如日志記錄或錯誤處理。了解這兩個階段有助于精確控制JavaScript響應用戶操作的時機和方式。

Java和JavaScript有什么區(qū)別? Java和JavaScript有什么區(qū)別? Jun 17, 2025 am 09:17 AM

Java和JavaScript是不同的編程語言。1.Java是靜態(tài)類型、編譯型語言,適用于企業(yè)應用和大型系統(tǒng)。2.JavaScript是動態(tài)類型、解釋型語言,主要用于網(wǎng)頁交互和前端開發(fā)。

See all articles