擴充套件 Node JS 應用
可擴充套件性是應用程式能夠繼續為使用者提供服務而不會失敗,即使工作量增加也是如此。因此,擴充套件是增加計算、儲存或網路資源以優化資源利用率並滿足使用者增加的流量的過程。
還可以進行擴充套件以減少故障,從而提高服務的可用性。縮放有兩種型別:向上縮放、垂直縮放和向外縮放,也稱為水平縮放。
眾所周知,Node JS 是一種單執行緒語言,一次只允許執行一個程序。但是,我們可以通過叢集模組等功能利用現代計算機中的多個 CPU 核心,而不會耗盡 RAM。
除此之外,使用這個模組,如果需要,我們可以輕鬆地重新啟動我們的應用程式,而不會經歷極端的停機時間。此外,Node JS 的非同步和非阻塞特性允許我們同時執行多個程序而不會使伺服器過載。
現在在 Node JS 中,我們可以使用不同的策略來擴充套件 Node JS 應用程式,其中一些將在下面討論。
使用叢集模組擴充套件 Node JS 應用程式
cluster 模組允許我們建立多核系統,而不是依賴 Node JS 的單執行緒特性。
使用這個模組,我們可以建立多個子程序,稱為 worker,它們在同一個伺服器埠上執行。這意味著隨著工作量的增加,我們可以處理所有的使用者請求,從而增加程序中的伺服器吞吐量。
幾個子程序允許我們在不阻塞其他操作的情況下處理多個請求。這主要是因為每個程序/工作者都在其事件執行緒上執行,並在引擎和記憶體中分配了其例項。
如前所述,無論如何,如果我們想重新啟動我們的應用程式或將新的更新推送到生產環境,使用叢集模組可以讓我們減少停機時間。這是因為我們可以讓一些子程序執行,而我們在任何時候處理其餘的程序。
我們可以通過首先擁有一個主要職責是處理所有傳入請求的主程序來實現這種方法。然後,主程序將分叉子程序並使用迴圈演算法為它們分配一個要處理的請求。
與其他演算法不同,輪循演算法不會按優先順序為子程序/工作者分配角色,而是按編號分配角色。第一個請求被分配給第一個可用的子程序。
如此處所示,我們可以建立共享埠 8080
的主程序和子程序。
const cluster = require('cluster');
const cpu_cores = require('os').cpus().length;
const process = require('process');
const http = require('http');
if (cluster.isPrimary) {
console.log(`Main Process ${process.pid} is running`);
for (let i = 0; i < cpu_cores; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`This worker ${worker.process.pid} has died`);
});
} else {
http.createServer((req, res) => {
res.writeHead(200);
res.end(' This is the end\n');
})
.listen(8080);
console.log(`Child Process ${process.pid} is running`);
}
輸出:
Main Process 10928 is running
Child Process 13664 is running
Child Process 10396 is running
Child Process 2952 is running
Child Process 9652 is running
Node JS 中的微服務
微服務是一種設計模式,它允許我們將應用程式分解為鬆散耦合的獨立功能單元,這些單元可以獨立地進行測試、部署和擴充套件。
每個功能單元或服務都有一個專用的資料庫和介面。使用這種架構時,主要關注點通常是確保服務是鬆散耦合的,而不是最小化它們的大小。
當與非阻塞特性相結合時,Node JS 和微服務允許開發人員將大型企業應用程式分解為模組化結構。每個元件都可以分配給專用資源並僅在必要時進行擴充套件。
除了在 Node JS 應用程式中使用這種架構的卓越效能外,它還具有成本效益,並允許開發人員構建處理巨大工作負載的高度可擴充套件的應用程式。
Node JS 中的分片和分割槽
這些概念在構建可擴充套件的資料庫架構中很常見。儘管有時它們暗示著同樣的事情,但事實並非如此。
分片使我們能夠實現水平分割槽。在使用 Node JS 構建資料密集型應用程式時,我們可以將資料劃分為單獨的伺服器例項,從而減少單個伺服器的負載。
劃分這些資料的依據是我們所說的 Shady key。例如,我們可以決定根據使用者的地理位置對資料進行細分。
另一方面,分割槽使我們能夠使用稍微不同的方法來擴充套件我們的 Node JS 應用程式。在返回適當的響應之前,每個應用程式通常都會掃描資料庫中的請求資料。
我們可以將大型資料庫表拆分為較小的表,以減少響應時間,並使我們的 Node JS 應用程式即使在工作負載增加時也具有更高的響應性。這使我們的 Node JS 應用程式可以輕鬆掃描資料並快速返回響應。
你可以使用更多方法來擴充套件 Node JS 應用程式。隨著更現代的工具(如 Amazon CloudFront、Redis)和現代負載均衡器(如 Nginx Plus 或 AWS 的 ELB)的出現,構建更具可擴充套件性的應用程式變得越來越容易。
Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.
LinkedIn