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

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

2018-07-20    來(lái)源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線(xiàn)!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

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

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

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

就像下圖:

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

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

procfile.js

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

首先, 我們提出了一個(gè)進(jìn)程結(jié)構(gòu)定義文件,我們管它叫 procfile.js 。

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

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

Pandora.js 會(huì)守護(hù)創(chuàng)建出來(lái)的進(jìn)程。

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

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

不過(guò)我們今天大致講講進(jìn)程相關(guān)的設(shè)計(jì)思考,怎么安裝、怎么啟動(dòng)還請(qǐng)到我們 GitHub 中查看文檔~

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

BTW

項(xiàng)目地址: https://github.com/midwayjs/pandora ,大家覺(jué)得好也去給點(diǎn)個(gè) Star ~~

簡(jiǎn)單的 procfile.js 例子

如果要定義一個(gè)進(jìn)程,大致樣例是這樣的:

procfile.js

// procfile.js 是一個(gè)普通的 Node.js 模塊,必須導(dǎo)出一個(gè) function
// function(pandora) 的第一個(gè)參數(shù)是 pandora,這個(gè)對(duì)象用于定義我們的進(jìn)程結(jié)構(gòu)
module.exports = function(pandora) {
  pandora
    // 定義一個(gè)進(jìn)程,名字叫 processA
    .process('processA')

    // 如果 scale 大于 1 ,將使用 Node.js 的 Cluster 模塊自動(dòng)產(chǎn)生進(jìn)程組
    .scale(1)

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

    // 定義進(jìn)程環(huán)境變量,創(chuàng)建出來(lái)的進(jìn)程中可以通過(guò) process.env 獲得
    .env({
      ENV_VAR1: 'VALUE_OF_ENV_VAR1'
    })

	// 啟動(dòng)順序
	.order(1)

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

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

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

上面簡(jiǎn)單的定義了一個(gè)入口是 ./app.js 的進(jìn)程叫 processA,這基本和 node ./app.js 一樣。

針對(duì)這種場(chǎng)景,我們還提供了另一個(gè)更簡(jiǎn)單的方式。

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

進(jìn)程伸縮 - Scalable

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

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

上面這個(gè)定義的意思是,將名為 processX 的進(jìn)程擴(kuò)展 5 份。

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

都是 Pandora.js 根據(jù) Scale 這個(gè)值自動(dòng)決定的。

下圖可能更容易理解:

未完待續(xù)

這篇只是介紹了進(jìn)程定義的一部分能力,還有更多在未來(lái)分享喔。這只是我們開(kāi)始 Pandora.js 之旅的第一部分。

接下來(lái)關(guān)于如何守護(hù)進(jìn)程、如何監(jiān)控應(yīng)用、如何追蹤鏈路、迷人的 Dashboard、如何與現(xiàn)有 APM 結(jié)合(比如 Open-Falcon)都會(huì)是一篇篇的干貨。大家敬請(qǐng)期待!

最后,不要忘了給點(diǎn)個(gè) Star 喔~

https://github.com/midwayjs/pandora

最后的最后,我們招人。我們有超過(guò)一半的淘寶前臺(tái)訪(fǎng)問(wèn)在 Node.js 上,也有做開(kāi)源 Node.js 軟件的機(jī)會(huì),挑戰(zhàn)不小,當(dāng)然回報(bào)也不小。

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

 

來(lái)自:http://taobaofed.org/blog/2017/12/13/pandora/

 

標(biāo)簽: ssd 服務(wù)商 通信 云服務(wù)

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

上一篇:GraphQL技術(shù)棧概覽:如何將所有的功能組合起來(lái)

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