最新国产好看的视频,伊人天堂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)程運(yùn)行在${process.pid}`))
} else {
 app.listen(1314) // export app 一個 Koa 服務(wù)器的實(shí)例
 console.log(chalk.green(`子進(jìn)程運(yùn)行在${process.pid}`))
}
#子進(jìn)程運(yùn)行在17768
#子進(jìn)程運(yùn)行在5784
#子進(jìn)程運(yùn)行在11232
#子進(jìn)程運(yùn)行在7904
#主進(jìn)程運(yùn)行在12960
#子進(jìn)程運(yùn)行在4300
#子進(jìn)程運(yù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)程實(shí)例,在通信過程中基本沒有用到
  4. process(child) 子進(jìn)程本身的實(shí)例,只能在子進(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ì)呢?因?yàn)樽舆M(jìn)程會有多個,只有通過 worker 才能選擇和哪個進(jìn)程通信

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

調(diào)度策略,包括循環(huán)計(jì)數(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)境變量來實(shí)現(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è)計(jì)應(yīng)用時,不應(yīng)該過分依賴內(nèi)存數(shù)據(jù)對象(如sessions和login等)。由于各工作進(jìn)程是獨(dú)立的進(jìn)程,它們可以根據(jù)需要隨時關(guān)閉或重新生成,而不影響其他進(jìn)程的正常運(yùn)行。只要有存活的工作進(jìn)程,服務(wù)器就可以繼續(xù)處理連接。如果沒有存活的工作進(jìn)程,現(xiàn)有連接會丟失,新的連接也會被拒絕。Node.js不會自動管理工作進(jìn)程的數(shù)量,而應(yīng)該由具體的應(yīng)用根據(jù)實(shí)際需要來管理進(jìn)程池。

文檔中已明確說明了,每一個工作進(jìn)程都是獨(dú)立的,并且互相之間除了能夠進(jìn)行通信外,沒有辦法共享內(nèi)存。所以在設(shè)計(jì)鑒權(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 的實(shí)現(xiàn)

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

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

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

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

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

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

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

最后

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

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

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

相關(guān)文章

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

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

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

    nodejs初始化init的示例代碼

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

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

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

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

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

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

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

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

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

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

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

    Node.js中Playwright庫使用指南

    Playwright 是微軟開源的一個用于 Web 測試和自動化的Node.js 庫,通過一個 API,可以自動化運(yùn)行在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)證的實(shí)現(xiàn)

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

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

最新評論

民县| 肥乡县| 英山县| 陆川县| 兰坪| 高密市| 柯坪县| 永善县| 雅安市| 建瓯市| 东台市| 手机| 仙居县| 邮箱| 郸城县| 定南县| 绥阳县| 观塘区| 乐陵市| 山西省| 松阳县| 中山市| 文昌市| 普洱| 哈巴河县| 广平县| 阿拉善左旗| 彰化市| 麻城市| 敦化市| 万荣县| 独山县| 贵溪市| 宁陕县| 武义县| 宿迁市| 松原市| 梓潼县| 中超| 石台县| 麻栗坡县|