搜尋
首頁web前端js教程如何使用node中cluster集群

這次帶給大家如何使用node中cluster集群,使用node中cluster集群的注意事項有哪些,下面就是實戰案例,一起來看一下。

結論

雖然平常透過設定為CPU進程數的工作進程,但是可以超過這個數,並且並不是主進程先創建

if (cluster.isMaster) {
 // 循环 fork 任务 CPU i5-7300HQ 四核四进程
 for (let i = 0; i <p style="text-align: left;">在主進程中cluster 表示主進程(用於監聽、發送事件), process 是本身的進程,worker 表示子進程,透過cluster.workers 取得</p><p style="text-align: left;">在子進程中process 表示子程序(用於監聽、發送事件),也可以透過cluster.worker 表示目前子程序</p><p style="text-align: left;">cluster.worker.process 等價於process(在子程序中)</p><p style="text-align: left;"><span style="color: #ff0000"><strong>#主程序子程序相互通訊</strong></span></p><p style="text-align: left;"><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/061/021/7bf610320e74dbfb92ff934022d0032d-0.png?x-oss-process=image/resize,p_40" class="lazy" alt=""></p><ol class=" list-paddingleft-2">
<li><p style="text-align: left;">#cluster 用來監聽process(child) 子程序觸發的各種事件</p></li>
<li><p style="text-align: left;">worker 在主流程中獲取,用於和自身通訊。當子程序觸發事件時,會傳回目前的worker 以及相關的資訊到主程序對應的事件中</p></li>
<li><p style="text-align: left;">#process(parent) 主程序本身的程序實例,在通訊過程中基本上沒有用到</p></li>
<li><p style="text-align: left;">process(child) 子程序本身的實例,只能在子程序取得用於監聽自身的事件</p></li>
</ol><p style="text-align: left;">可見主進程與子進程透過這樣一個三角關係互相通信,其中cluster 和worker 是在主進程中取得的,process(child) 是子進程。 cluster 透過操作 worker 通知子進程,子進程本身和 cluster 進行通訊。為什麼要這樣設計呢?因為子進程會有多個,只有透過worker 才能選擇和哪個進程通訊</p><p style="text-align: left;"><span style="color: #ff0000"><strong>子進程的調度策略cluster.schedulingPolicy</strong></span></p><p style="text-align: left;">調度策略,包括循環計數的cluster.SCHED_RR,以及由作業系統決定的cluster.SCHED_NONE。這是一個全域設置,當第一個工作進程被衍生或調動cluster.setupMaster()時,都將第一時間生效。除Windows以外的所有作業系統中,SCHED_RR都是預設值。只要libuv可以有效地分發IOCP handle,而不會導致嚴重的效能衝擊的話,Windows系統也會更改為SCHED_RR。 cluster.schedulingPolicy 可以透過設定NODE_CLUSTER_SCHED_POLICY環境<a href="http://www.php.cn/wiki/70.html" target="_blank">變數</a>來實現。這個環境變數的有效值包括"rr" 和 "none"。 </p><p style="text-align: left;">RR 即 Round-Robin 輪詢調度,即每個子程序的獲取的事件的機會是均等的,這是除 windows以外預設的。而 windows 下的調度策略很詭異,見下圖。目前並沒有相關API 可以設定調度策略的演算法,node 只為我們提供了兩個值</p><p style="text-align: left;"><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/061/021/7bf610320e74dbfb92ff934022d0032d-1.png?x-oss-process=image/resize,p_40" class="lazy" alt=""></p><p   style="max-width:90%">進程調度演算法.png</p><p style="text-align: left;">測試資料為1000次並發請求,重複測試20次,在windows下的表現。可見 windows 的調度演算法表現的雜亂無章。如果是 RR 演算法四條程序的調度應該處於同一橫線上。暫時沒在本地搭建 linux 環境,有條件的同學可以協助測試一波。 <br>cluster的調度演算法目前至於系統有關</p><p style="text-align: left;"><span style="color: #ff0000"><strong>多進程間的鑑權問題</strong></span></p><p style="text-align: left;">注意:<a href="http://www.php.cn/wiki/1498.html" target="_blank">Node.js </a>不支援路由邏輯。因此在設計應用時,不應該過度依賴記憶體資料<a href="http://www.php.cn/wiki/60.html" target="_blank">物件</a>(如<a href="http://www.php.cn/php/php-tp-session.html" target="_blank">session</a>s和login等)。由於各工作進程是獨立的進程,它們可以根據需要隨時關閉或重新生成,而不影響其他進程的正常運作。只要有存活的工作進程,伺服器就可以繼續處理連線。如果沒有存活的工作進程,現有連線會遺失,新的連線也會被拒絕。 Node.js不會自動管理工作進程的數量,而應該由具體的應用根據實際需求來管理進程池。 </p><p style="text-align: left;">文档中已明确说明了,每一个工作进程都是独立的,并且互相之间除了能够进行通信外,没有办法共享内存。所以在设计鉴权的时候,有两种方法</p><ol class=" list-paddingleft-2">
<li><p style="text-align: left;">通过共有的主进程存储鉴权信息,每次前端提交帐号密码,授权完成后,将 token 发送给主进程,下次前台<a href="http://www.php.cn/php/php-tp-demand.html" target="_blank">查询</a>时先在主进程获取授权信息</p></li>
<li><p style="text-align: left;">通过统一的外部 redis 存取</p></li>
</ol><p style="text-align: left;">两种方法看来还是第二种好的不要太多,因此多进程的环境下,应该使用外部数据库统一存储 token 信息</p><p style="text-align: left;"><span style="color: #ff0000"><strong>进一步的子进程间通信思考</strong></span></p><p style="text-align: left;">虽然 node 中并没有直接提供的进程间通讯功能,但是我们可以通过主进程相互协调进程间的通讯功能,需要定义标准的通信格式,例如</p><pre class="brush:php;toolbar:false">interface cmd {
 type: string
 from: number
 to: number
 msg: any
}

这样通过统一的格式,主进程就可以识别来自各个进程间的通信,起到进程通信中枢的功能

egg.js 中 agent 的实现

        +--------+     +-------+
        | Master || Agent |
        +--------+     +-------+
        ^  ^  ^
        /  |   \
       /   |    \
      /    |     \
     v     v     v
+----------+  +----------+  +----------+
| Worker 1 |  | Worker 2 |  | Worker 3 |
+----------+  +----------+  +----------+

我们看到 egg 在多进程模型之间实现了一个 agent 进程,这个进程主要负责对整个系统的定期维护

说到这里,Node.js 多进程方案貌似已经成型,这也是我们早期线上使用的方案。但后来我们发现有些工作其实不需要每个 Worker 都去做,如果都做,一来是浪费资源,更重要的是可能会导致多进程间资源访问冲突。举个例子:生产环境的日志文件我们一般会按照日期进行归档,在单进程模型下这再简单不过了:

每天凌晨 0 点,将当前日志文件按照日期进行重命名

销毁以前的文件句柄,并创建新的日志文件继续写入

试想如果现在是 4 个进程来做同样的事情,是不是就乱套了。所以,对于这一类后台运行的逻辑,我们希望将它们放到一个单独的进程上去执行,这个进程就叫 Agent Worker,简称 Agent。Agent 好比是 Master 给其他 Worker 请的一个『秘书』,它不对外提供服务,只给 App Worker 打工,专门处理一些公共事务。

这样我们可以指定一个进程作为 agent 进程,用于实现自己定义的事务。在 egg 中,主线程启动后 首先 fork agent进程,当 agent 进程启动完成后再启动具体的 worker 进程。参照上面的代码,相信这部分逻辑现在也不难实现了。这样 agent 就会获得 id 为1的进程

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

如何使用vue中实现点击空白处隐藏div实现

怎样使用JS+setInterval实现计时器

以上是如何使用node中cluster集群的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python和JavaScript的未來:趨勢和預測Python和JavaScript的未來:趨勢和預測Apr 27, 2025 am 12:21 AM

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python vs. JavaScript:開發環境和工具Python vs. JavaScript:開發環境和工具Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

JavaScript是用C編寫的嗎?檢查證據JavaScript是用C編寫的嗎?檢查證據Apr 25, 2025 am 12:15 AM

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript的角色:使網絡交互和動態JavaScript的角色:使網絡交互和動態Apr 24, 2025 am 12:12 AM

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C和JavaScript:連接解釋C和JavaScript:連接解釋Apr 23, 2025 am 12:07 AM

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

從網站到應用程序:JavaScript的不同應用從網站到應用程序:JavaScript的不同應用Apr 22, 2025 am 12:02 AM

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python vs. JavaScript:比較用例和應用程序Python vs. JavaScript:比較用例和應用程序Apr 21, 2025 am 12:01 AM

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C/C在JavaScript口譯員和編譯器中的作用C/C在JavaScript口譯員和編譯器中的作用Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具