管理 Node.js 進程從未如此優雅

JeffryMcclo 7年前發布 | 31K 次閱讀 進程 Node.js Node.js 開發

說到 Node.js 的進程模型,腦子里第一個閃現的可能是 Cluster 模塊,亦或是 Master / Worker 進程模型,在長期的使用過程中,我們逐漸發現,這樣在應用的開發早晚會有局限性,除了不夠優雅之外,每次增減進程或者自定義進程都會產生不可預知的問題。

在一些特定的場景下,我們甚至在 Master 下面加入了一個 Agent 進程用來運行一些中間件 SDK 。在這些修修補補的過程中,傳統的進程間通信,數據交換都變的困難,甚至 Worker 到 Agent 之間通信都無法很優雅的進行。

除了一些內存共享的通信場景, 也出現了 Worker 進程跑一些定時任務占用時間過長,導致 Web 接口超時等問題(或者系統容量降低)。更有甚者,把定時任務放到 Agent 中去執行,直接拖掛了基礎的中間件服務,導致應用全盤崩潰。

就像下圖:

雖然說影響可用性是一方面,但畢竟上面說到的情況也屬于軟件質量問題,通過充分的測試也可以避免,比較可怕的是進程模型和框架越綁越深。如果你想發布 RPC 服務、做一些任務處理,可能在復雜的進程模型下也沒法做到了,只能讓 Node.js 做一些 Web Server 的事情,在一定程度上給 Node.js 應用設置了限,不容易進化和發展。

這也是我們開發 Pandora.js 最直接的原因。

procfile.js

面對這樣的窘迫,從去年春節前后我們就開始準備做一些事情了,當然期間也走了一些彎路,在討論了多次之后將大部分的場景都理順了。

首先, 我們提出了一個進程結構定義文件,我們管它叫 procfile.js 。

看到 procfile 這個詞有些朋友可能熟悉,這是 Heroku (一個云服務商)進程定義文件的名字。我們也已經忘記是誰提出來要叫 procfile.js 的了,但是我們覺得這個名字還不錯,畢竟 procfile 是 Process File 的一種現有簡寫(我們就不用自己造詞了,省了一樁麻煩事)。

當然把進程交給 Pandora.js 管理,不只是幫你創建進程這么簡單,更是:

Pandora.js 會守護創建出來的進程。

小到自動重啟、切割日志文件、重啟次數計數。

大到 30 多項 Metrics 指標采集、自動的全鏈路 Trace 追蹤、對接現有 APM (比如 Open-Falcon)等等。

不過我們今天大致講講進程相關的設計思考,怎么安裝、怎么啟動還請到我們 GitHub 中查看文檔~

還有其他部分比如監控、Metrics、Trace 等也要未來再講啦~

BTW

項目地址: https://github.com/midwayjs/pandora ,大家覺得好也去給點個 Star ~~

簡單的 procfile.js 例子

如果要定義一個進程,大致樣例是這樣的:

procfile.js

// procfile.js 是一個普通的 Node.js 模塊,必須導出一個 function
// function(pandora) 的第一個參數是 pandora,這個對象用于定義我們的進程結構
module.exports = function(pandora) {
  pandora
    // 定義一個進程,名字叫 processA
    .process('processA')

    // 如果 scale 大于 1 ,將使用 Node.js 的 Cluster 模塊自動產生進程組
    .scale(1)

    // Node.js 參數
    .argv(['--expose-gc'])

    // 定義進程環境變量,創建出來的進程中可以通過 process.env 獲得
    .env({
      ENV_VAR1: 'VALUE_OF_ENV_VAR1'
    })

    // 啟動順序
    .order(1)

    // 這個進程的入口文件地址
    .entry('./app.js');

  /*
    pandora
     .process('processB');
    pandora
     .process('processC');
    pandora
     .process('processD');

    and so on so on....
  */
}

上面簡單的定義了一個入口是 ./app.js 的進程叫 processA,這基本和 node ./app.js 一樣。

針對這種場景,我們還提供了另一個更簡單的方式。

module.exports = function(pandora) {
  pandora.fork('processA', './app.js');
}

進程伸縮 - Scalable

大家上面看到了,procfile.js 中定義進程伸縮主要依靠下面的定義:

pandora.process(‘processX’).scale(5);

上面這個定義的意思是,將名為 processX 的進程擴展 5 份。

Scale 這個值在 Pandora.js 中很重要,用戶并不需要指定哪個進程,需要用 Cluster 模塊進行伸縮(使用 Master / Worker 模型),哪個進程直接啟動。

都是 Pandora.js 根據 Scale 這個值自動決定的。

下圖可能更容易理解:

未完待續

這篇只是介紹了進程定義的一部分能力,還有更多在未來分享喔。這只是我們開始 Pandora.js 之旅的第一部分。

接下來關于如何守護進程、如何監控應用、如何追蹤鏈路、迷人的 Dashboard、如何與現有 APM 結合(比如 Open-Falcon)都會是一篇篇的干貨。大家敬請期待!

最后,不要忘了給點個 Star 喔~

https://github.com/midwayjs/pandora

最后的最后,我們招人。我們有超過一半的淘寶前臺訪問在 Node.js 上,也有做開源 Node.js 軟件的機會,挑戰不小,當然回報也不小。

題圖: https://unsplash.com/photos/F9o7u-CnDJk By @Tony Webster

 

來自:http://taobaofed.org/blog/2017/12/13/pandora/

 

 本文由用戶 JeffryMcclo 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!