管理 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/