【程式語言 - NodeJS】使用Nodejs Cluster打破單線程的限制

更新於 2023/04/29閱讀時間約 4 分鐘
由於Javascript本身設計就適合於單線程的應用, 但一般後端應用程式都會支援多個服務來處理client的請求, nodejs中也提供了cluster模組來達成此功能。
Cluster的原理很簡單,由於每個Process都只能用單核心的CPU來運行,那麼就多開幾個來幫忙處理吧! 而這個Cluster的模組強大的地方在於讓我們只監聽一個Port,加上Master/Worker的概念,當收到請求後就分配給底下的Worker進行處理。
這樣有什麼好處? 遇到尖峰時刻時,我們可以妥善利用多核的優勢,避免有些CPU閒置造成浪費。

如何實做?

根據系統的cpu數量建立N個worker來進行處理。
// server.js
const cluster = require('cluster');
const cpuNums = require('os').cpus().length;
const http = require('http');
if (cluster.isMaster) {
console.info(`cpu: ${cpuNums}`);
for (var i = 0; i < cpuNums; i++) {
cluster.fork();
}
} else {
http.createServer(function(req, res) {
res.end(`response from worker ${process.pid}`);
}).listen(5000);
console.log(`Worker ${process.pid} started`);
}
建立測試腳本
for ((i = 1; i <= 8; i++)); do
curl <http://127.0.0.1:5000>
echo ""
done
輸出如下, 可以看到response來自不同的worker:
response from worker 7872
response from worker 7878
response from worker 7886
response from worker 7893
response from worker 7853
response from worker 7860
response from worker 7855
response from worker 7866

如何將請求分發到多個worker

每個worker建立時都會於master上註冊並建立IPC通道, 而客戶端請求到達時, master會負責將請求分配給worker。
這裡可能會有疑問是這些請求是如何被分配的?採取什麼策略?
預設的分配策略是輪詢的方式, 當請求到達時, master會輪詢一遍worker列表, 看誰有空閒就將請求分配給該worker進行處理。
另外也支援無分配策略但這種方式可能會造成搶食現象的競爭問題。
可以透過環境變數NODE_CLUSTER_SCHED_POLICY設定, 也可以在cluster.setupMaster(options)時傳入。

process之間的通訊

由於各個process無法共享資源, 但可以藉由IPC通訊方式讓master與worker之間進行通信, 基本用法如下:
// worker 發送訊息
process.send('讀取訊息');// master 接收消息 -> 處理 -> 回應
cluster.on('online', function (worker) {
// worker建立時,開始監聽message事件
cluster.workers[id].on('message', function(data) {
// 處理來自worker發送的資料
// 回傳給worker
cluster.workers[id].send('result')
});
});
為什麼會看到廣告
avatar-img
116會員
261內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
阿Han的沙龍 的其他內容
Named Entity Recognition(NER)是一種自然語言處理技術,它的目的是識別文本中的具有特定意義的實體(也稱為命名實體)。這些命名實體可以是人名、地名、組織名、日期、時間、數量等等。 這項技術可以幫助機器更好地理解文本,提高自然語言處理的精度和效率,也可以用於許多應用場景,例如搜
上一篇「【Google Colab Python系列】 初探Whisper: 來對一段Youtube影片進行辨識吧!」我們介紹了Whisper的基本用法及功能,這次我們除了語音辨識之外,還要下載辨識後的字幕檔,我想這對於我們常常看到沒有字幕的影片,若想要進行辨識與翻譯時非常有幫助。 這次的篇章主要做
這個篇章主要是讓我們能夠熟悉Whisper的安裝與使用方式,並簡單的對Youtube影片進行線上翻譯的工作,主軸在於了解一下整個Whisper使用方式到底是簡單還是複雜,就讓我們一起來玩玩看吧! 在這之前我們還是說一下Whisper它是什麼樣的一個工具,能夠做什麼? Whisper 是OpenAI
Named Entity Recognition(NER)是一種自然語言處理技術,它的目的是識別文本中的具有特定意義的實體(也稱為命名實體)。這些命名實體可以是人名、地名、組織名、日期、時間、數量等等。 這項技術可以幫助機器更好地理解文本,提高自然語言處理的精度和效率,也可以用於許多應用場景,例如搜
上一篇「【Google Colab Python系列】 初探Whisper: 來對一段Youtube影片進行辨識吧!」我們介紹了Whisper的基本用法及功能,這次我們除了語音辨識之外,還要下載辨識後的字幕檔,我想這對於我們常常看到沒有字幕的影片,若想要進行辨識與翻譯時非常有幫助。 這次的篇章主要做
這個篇章主要是讓我們能夠熟悉Whisper的安裝與使用方式,並簡單的對Youtube影片進行線上翻譯的工作,主軸在於了解一下整個Whisper使用方式到底是簡單還是複雜,就讓我們一起來玩玩看吧! 在這之前我們還是說一下Whisper它是什麼樣的一個工具,能夠做什麼? Whisper 是OpenAI
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
在一次五天的年假中,我決定開始學習Python編程。雖然最初進展順利,但後來發現自己在解題和邏輯方面遇到了困難。經過思考後,我決定轉而學習C/C++,並且制定了一個計畫,希望成為一名後端工程師。這將需要挑戰我的時間管理能力。
Thumbnail
關於程式語言的學習,只要掌握住幾個基本特性要熟悉幾種程式語言也不困難,這三個基本特性就是…
Thumbnail
先前大家為了數位中介服務法草案是否會箝制言論自由吵翻天,網路言論自由當然也是存在於Web3.0世界與幣圈,放眼現今與未來的Web3.0世界與幣圈,主要的生態系與應用大多在以太坊的智能合約與代幣經濟,而智能合約與代幣都是由程式語言所撰寫建構。但最近幣圈也出現言論自由遭到迫害的案例,也就是撰擬Torna
Thumbnail
之前跟大家分享【表現目標】和【學習目標】,有助於設定自學的終點,但是在執行目標的過程中是否遇過有目標也難以下手的問題呢?今天想跟大家說說【拆解目標】,這也是我在自學製作封鎖電商黑名單chrome插件賺取被動收入過程中運用的方法,希望對剛入門自學程式的朋友有幫助
Thumbnail
【為何而學?】 相信剛入門自學程式的人都會遇到許多困難,可能教學資源太多無從下手,或是學了基礎可是無法自己寫出功能,不過最常見的應該屬目標導向的問題,就是不知道為何而學,我自己也是靠著自學製作了一個幫賣家封鎖電商黑名單的chrome插件賺取被動收入,對於設定目標有一點點心得想分享給大家:
Thumbnail
為什麼想學程式語言? 這個問題應該是知道我有在學程式語言的人,馬上脫口而出的問題。 對呀!WHY?一個即將邁向40大關的中年男子(從叔叔→阿伯),為什麼要這麼想不開,突然跳進一堆看不懂...呃...
Thumbnail
世界上有最好的程式語言嗎?答案絕對是否定的,每種語言都有適合的使用時機,而也有不少程式語言是隨著時代變遷而消失的。請放下自己要學到最好語言的心態,多看多學,自然會找到適合你的語言。這篇文章會用客觀的角度跟你分享最多人使用的程式語言。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
在一次五天的年假中,我決定開始學習Python編程。雖然最初進展順利,但後來發現自己在解題和邏輯方面遇到了困難。經過思考後,我決定轉而學習C/C++,並且制定了一個計畫,希望成為一名後端工程師。這將需要挑戰我的時間管理能力。
Thumbnail
關於程式語言的學習,只要掌握住幾個基本特性要熟悉幾種程式語言也不困難,這三個基本特性就是…
Thumbnail
先前大家為了數位中介服務法草案是否會箝制言論自由吵翻天,網路言論自由當然也是存在於Web3.0世界與幣圈,放眼現今與未來的Web3.0世界與幣圈,主要的生態系與應用大多在以太坊的智能合約與代幣經濟,而智能合約與代幣都是由程式語言所撰寫建構。但最近幣圈也出現言論自由遭到迫害的案例,也就是撰擬Torna
Thumbnail
之前跟大家分享【表現目標】和【學習目標】,有助於設定自學的終點,但是在執行目標的過程中是否遇過有目標也難以下手的問題呢?今天想跟大家說說【拆解目標】,這也是我在自學製作封鎖電商黑名單chrome插件賺取被動收入過程中運用的方法,希望對剛入門自學程式的朋友有幫助
Thumbnail
【為何而學?】 相信剛入門自學程式的人都會遇到許多困難,可能教學資源太多無從下手,或是學了基礎可是無法自己寫出功能,不過最常見的應該屬目標導向的問題,就是不知道為何而學,我自己也是靠著自學製作了一個幫賣家封鎖電商黑名單的chrome插件賺取被動收入,對於設定目標有一點點心得想分享給大家:
Thumbnail
為什麼想學程式語言? 這個問題應該是知道我有在學程式語言的人,馬上脫口而出的問題。 對呀!WHY?一個即將邁向40大關的中年男子(從叔叔→阿伯),為什麼要這麼想不開,突然跳進一堆看不懂...呃...
Thumbnail
世界上有最好的程式語言嗎?答案絕對是否定的,每種語言都有適合的使用時機,而也有不少程式語言是隨著時代變遷而消失的。請放下自己要學到最好語言的心態,多看多學,自然會找到適合你的語言。這篇文章會用客觀的角度跟你分享最多人使用的程式語言。