最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談node中的cluster集群

 更新時間:2018年06月02日 11:49:16   作者:Mr_Treasure  
這篇文章主要介紹了淺談node中的cluster集群,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

結(jié)論

雖然平常通過設(shè)置為CPU進(jìn)程數(shù)的工作進(jìn)程,但是可以超過這個數(shù),并且并不是主進(jìn)程先創(chuàng)建

if (cluster.isMaster) {
 // 循環(huán) fork 任務(wù) CPU i5-7300HQ 四核四進(jìn)程
 for (let i = 0; i < 6; i++) {
  cluster.fork()
 }
 console.log(chalk.green(`主進(jìn)程運行在${process.pid}`))
} else {
 app.listen(1314) // export app 一個 Koa 服務(wù)器的實例
 console.log(chalk.green(`子進(jìn)程運行在${process.pid}`))
}
#子進(jìn)程運行在17768
#子進(jìn)程運行在5784
#子進(jìn)程運行在11232
#子進(jìn)程運行在7904
#主進(jìn)程運行在12960
#子進(jìn)程運行在4300
#子進(jìn)程運行在16056

在主進(jìn)程中 cluster 表示主進(jìn)程(用于監(jiān)聽、發(fā)送事件), process 是本身的進(jìn)程,worker 表示子進(jìn)程,通過 cluster.workers 獲取

在子進(jìn)程中 process 表示子進(jìn)程(用于監(jiān)聽、發(fā)送事件),也可以通過 cluster.worker 表示當(dāng)前子進(jìn)程

cluster.worker.process 等價于 process(在子進(jìn)程中)

主進(jìn)程子進(jìn)程相互通信


  1. cluster 用于監(jiān)聽 process(child) 子進(jìn)程觸發(fā)的各種事件
  2. worker 在主進(jìn)程中獲取,用于和自身通信。當(dāng)子進(jìn)程觸發(fā)事件時,會返回當(dāng)前的 worker 以及相關(guān)的信息到主進(jìn)程相應(yīng)的事件中
  3. process(parent) 主進(jìn)程本身的進(jìn)程實例,在通信過程中基本沒有用到
  4. process(child) 子進(jìn)程本身的實例,只能在子進(jìn)程獲取用于監(jiān)聽自身的事件

可見主進(jìn)程與子進(jìn)程通過這樣一個三角關(guān)系互相通信,其中 cluster 和 worker 是在主進(jìn)程中獲取的,process(child) 是子進(jìn)程。 cluster 通過操作 worker 通知子進(jìn)程,子進(jìn)程本身和 cluster 進(jìn)行通信。為什么要這樣設(shè)計呢?因為子進(jìn)程會有多個,只有通過 worker 才能選擇和哪個進(jìn)程通信

子進(jìn)程的調(diào)度策略 cluster.schedulingPolicy

調(diào)度策略,包括循環(huán)計數(shù)的 cluster.SCHED_RR,以及由操作系統(tǒng)決定的cluster.SCHED_NONE。 這是一個全局設(shè)置,當(dāng)?shù)谝粋€工作進(jìn)程被衍生或者調(diào)動cluster.setupMaster()時,都將第一時間生效。除Windows外的所有操作系統(tǒng)中,SCHED_RR都是默認(rèn)設(shè)置。只要libuv可以有效地分發(fā)IOCP handle,而不會導(dǎo)致嚴(yán)重的性能沖擊的話,Windows系統(tǒng)也會更改為SCHED_RR。cluster.schedulingPolicy 可以通過設(shè)置NODE_CLUSTER_SCHED_POLICY環(huán)境變量來實現(xiàn)。這個環(huán)境變量的有效值包括"rr" 和 "none"。

RR 即 Round-Robin 輪詢調(diào)度,即每個子進(jìn)程的獲取的事件的機(jī)會是均等的,這是除 windows以外默認(rèn)的。而 windows 下的調(diào)度策略很詭異,見下圖。目前并沒有相關(guān) API 可以設(shè)置調(diào)度策略的算法,node 只為我們提供了兩個值

進(jìn)程調(diào)度算法.png

測試數(shù)據(jù)為 1000次 并發(fā)請求,重復(fù)測試20次,在windows下的表現(xiàn)情況??梢?windows 的調(diào)度算法表現(xiàn)的雜亂無章。如果是 RR 算法四條進(jìn)程的調(diào)度應(yīng)該處于同一橫線上。暫時沒在本地搭建 linux 環(huán)境,有條件的同學(xué)可以協(xié)助測試一波。
cluster的調(diào)度算法目前至于系統(tǒng)有關(guān)

多進(jìn)程間的鑒權(quán)問題

注意:Node.js不支持路由邏輯。因此在設(shè)計應(yīng)用時,不應(yīng)該過分依賴內(nèi)存數(shù)據(jù)對象(如sessions和login等)。由于各工作進(jìn)程是獨立的進(jìn)程,它們可以根據(jù)需要隨時關(guān)閉或重新生成,而不影響其他進(jìn)程的正常運行。只要有存活的工作進(jìn)程,服務(wù)器就可以繼續(xù)處理連接。如果沒有存活的工作進(jìn)程,現(xiàn)有連接會丟失,新的連接也會被拒絕。Node.js不會自動管理工作進(jìn)程的數(shù)量,而應(yīng)該由具體的應(yīng)用根據(jù)實際需要來管理進(jìn)程池。

文檔中已明確說明了,每一個工作進(jìn)程都是獨立的,并且互相之間除了能夠進(jìn)行通信外,沒有辦法共享內(nèi)存。所以在設(shè)計鑒權(quán)的時候,有兩種方法

  1. 通過共有的主進(jìn)程存儲鑒權(quán)信息,每次前端提交帳號密碼,授權(quán)完成后,將 token 發(fā)送給主進(jìn)程,下次前臺查詢時先在主進(jìn)程獲取授權(quán)信息
  2. 通過統(tǒng)一的外部 redis 存取

兩種方法看來還是第二種好的不要太多,因此多進(jìn)程的環(huán)境下,應(yīng)該使用外部數(shù)據(jù)庫統(tǒng)一存儲 token 信息

進(jìn)一步的子進(jìn)程間通信思考

雖然 node 中并沒有直接提供的進(jìn)程間通訊功能,但是我們可以通過主進(jìn)程相互協(xié)調(diào)進(jìn)程間的通訊功能,需要定義標(biāo)準(zhǔn)的通信格式,例如

interface cmd {
 type: string
 from: number
 to: number
 msg: any
}

這樣通過統(tǒng)一的格式,主進(jìn)程就可以識別來自各個進(jìn)程間的通信,起到進(jìn)程通信中樞的功能

egg.js 中 agent 的實現(xiàn)

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

我們看到 egg 在多進(jìn)程模型之間實現(xiàn)了一個 agent 進(jìn)程,這個進(jìn)程主要負(fù)責(zé)對整個系統(tǒng)的定期維護(hù)

說到這里,Node.js 多進(jìn)程方案貌似已經(jīng)成型,這也是我們早期線上使用的方案。但后來我們發(fā)現(xiàn)有些工作其實不需要每個 Worker 都去做,如果都做,一來是浪費資源,更重要的是可能會導(dǎo)致多進(jìn)程間資源訪問沖突。舉個例子:生產(chǎn)環(huán)境的日志文件我們一般會按照日期進(jìn)行歸檔,在單進(jìn)程模型下這再簡單不過了:

每天凌晨 0 點,將當(dāng)前日志文件按照日期進(jìn)行重命名

銷毀以前的文件句柄,并創(chuàng)建新的日志文件繼續(xù)寫入

試想如果現(xiàn)在是 4 個進(jìn)程來做同樣的事情,是不是就亂套了。所以,對于這一類后臺運行的邏輯,我們希望將它們放到一個單獨的進(jìn)程上去執(zhí)行,這個進(jìn)程就叫 Agent Worker,簡稱 Agent。Agent 好比是 Master 給其他 Worker 請的一個『秘書』,它不對外提供服務(wù),只給 App Worker 打工,專門處理一些公共事務(wù)。

這樣我們可以指定一個進(jìn)程作為 agent 進(jìn)程,用于實現(xiàn)自己定義的事務(wù)。在 egg 中,主線程啟動后 首先 fork agent進(jìn)程,當(dāng) agent 進(jìn)程啟動完成后再啟動具體的 worker 進(jìn)程。參照上面的代碼,相信這部分邏輯現(xiàn)在也不難實現(xiàn)了。這樣 agent 就會獲得 id 為1的進(jìn)程

最后

P.S 勘誤,圖2中的線程應(yīng)該為進(jìn)程,獨立的nodejs進(jìn)程

本文相關(guān)代碼在 github

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • node.js中實現(xiàn)同步操作的3種實現(xiàn)方法

    node.js中實現(xiàn)同步操作的3種實現(xiàn)方法

    這篇文章主要介紹了node.js中實現(xiàn)同步操作的3種實現(xiàn)方法,本文用實例講解一些需要同步操作的情況下,如何編程實現(xiàn),需要的朋友可以參考下
    2014-12-12
  • nodejs初始化init的示例代碼

    nodejs初始化init的示例代碼

    今天小編就為大家分享一篇nodejs初始化init的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • 詳解node.js 下載圖片的 2 種方式

    詳解node.js 下載圖片的 2 種方式

    本文通過實例代碼給大家介紹了node.js 下載圖片的 2 種方式及下載遠(yuǎn)程圖片的實現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-03-03
  • 教你如何用Node實現(xiàn)API的轉(zhuǎn)發(fā)(某音樂)

    教你如何用Node實現(xiàn)API的轉(zhuǎn)發(fā)(某音樂)

    這篇文章主要介紹了教你如何用Node實現(xiàn)API的轉(zhuǎn)發(fā)(某音樂),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 基于Node.js的WebSocket通信實現(xiàn)

    基于Node.js的WebSocket通信實現(xiàn)

    這篇文章主要介紹了基于Node.js的WebSocket通信實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • node.js中的buffer.write方法使用說明

    node.js中的buffer.write方法使用說明

    這篇文章主要介紹了node.js中的buffer.write方法使用說明,本文介紹了buffer.write的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 基于nodejs使用express創(chuàng)建web服務(wù)器的操作步驟

    基于nodejs使用express創(chuàng)建web服務(wù)器的操作步驟

    express實際上是對nodejs內(nèi)置http進(jìn)行封裝后的第三方包,其中提供了快捷創(chuàng)建web服務(wù)器以及處理請求路由的方法,使我們可以更加方便快捷的實現(xiàn)一個web服務(wù)器項目,本文件給大家詳細(xì)介紹基于nodejs使用express?創(chuàng)建web服務(wù)器的操作步驟
    2023-07-07
  • Node.js中Playwright庫使用指南

    Node.js中Playwright庫使用指南

    Playwright 是微軟開源的一個用于 Web 測試和自動化的Node.js 庫,通過一個 API,可以自動化運行在Chrome,Edge、Firefox和Safari等瀏覽器上,下面我們就來看看它的具體使用吧
    2024-11-11
  • Node.js中的文件系統(tǒng)(file system)模塊詳解

    Node.js中的文件系統(tǒng)(file system)模塊詳解

    Node.js文件系統(tǒng)模塊提供了豐富的方法,用于讀取、寫入、操作文件和目錄,文件系統(tǒng)模塊是Node.js強(qiáng)大而靈活的一部分,為文件操作提供了方便的API,本文給大家介紹Node.js中的文件系統(tǒng)(file system)模塊,感興趣的朋友一起看看吧
    2023-11-11
  • Node.js?express中的身份認(rèn)證的實現(xiàn)

    Node.js?express中的身份認(rèn)證的實現(xiàn)

    本文主要介紹了Node.js?express中的身份認(rèn)證的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01

最新評論

武陟县| 桓台县| 石景山区| 大同市| 大方县| 新竹县| 措美县| 墨脱县| 溧阳市| 井研县| 习水县| 海南省| 土默特右旗| 娱乐| 长乐市| 赤水市| 湄潭县| 罗甸县| 沂源县| 彭泽县| 珲春市| 文登市| 拉萨市| 忻城县| 博白县| 明溪县| 龙胜| 九寨沟县| 恩施市| 共和县| 衡南县| 元江| 鄂托克旗| 繁峙县| 龙山县| 自贡市| 黎平县| 吴堡县| 新津县| 临汾市| 进贤县|