這次帶給大家如何使用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中文网其它相关文章!
推荐阅读:
以上是如何使用node中cluster集群的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

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

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

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

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

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

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

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

WebStorm Mac版
好用的JavaScript開發工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具