標籤:

管理 Node.js 進程從未如此優雅 - Pandora.js 的 procfile.js

這篇是介紹 Pandora.js 的系列文章之一

項目地址:github.com/midwayjs/pan 歡迎社會各界前來 Star ~


說到 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

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


簡單的 procfile.js 例子

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

procfile.js

// procfile.js 是一個普通的 Node.js 模塊,必須導出一個 functionn// function(pandora) 的第一個參數是 pandora,這個對象用於定義我們的進程結構nmodule.exports = function(pandora) {nn pandoran n // 定義一個進程,名字叫 processAn .process(processA)ntn // 如果 scale 大於 1 ,將使用 Node.js 的 Cluster 模塊自動產生進程組n .scale(1)n n // Node.js 參數n .nodeArgs([--expose-gc])n n // 定義進程環境變數,創建出來的進程中可以通過 process.env 獲得n .env({n ENV_VAR1: VALUE_OF_ENV_VAR1n })ntnt// 啟動順序nt.order(1)ntnt// 這個進程的入口文件地址nt.entry(./app.js);ntnt/**ntpandorant .process(processB);nt ntpandorant .process(processC);nt ntpandorant .process(processD);nt ntand so on so on....n **n}n

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

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

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


進程伸縮 - 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 喔~

github.com/midwayjs/pan

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


推薦閱讀:

深入 Promise(一)——Promise 實現詳解
Koa2 源碼賞析
Node.js 性能調優之內存篇(一)——gcore+llnode
編寫 Node.js Rest API 的 10 個最佳實踐

TAG:Nodejs |