中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

管理 Node.js 進程從未如此優(yōu)雅

2018-07-20    來源:編程學習網(wǎng)

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

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

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

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

就像下圖:

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

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

procfile.js

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

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

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

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

Pandora.js 會守護創(chuàng)建出來的進程。

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

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

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

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

BTW

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

簡單的 procfile.js 例子

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

procfile.js

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

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

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

    // 定義進程環(huán)境變量,創(chuàng)建出來的進程中可以通過 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 根據(jù) Scale 這個值自動決定的。

下圖可能更容易理解:

未完待續(xù)

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

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

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

https://github.com/midwayjs/pandora

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

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

 

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

 

標簽: ssd 服務商 通信 云服務

版權申明:本站文章部分自網(wǎng)絡,如有侵權,請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:GraphQL技術棧概覽:如何將所有的功能組合起來

下一篇:Python玩“跳一跳” iOS+Win 硬件實現(xiàn)