node后端服務?;畹膶崿F(xiàn)
引言
目前的項目中使用了node,作為一個簡單的后端服務,隨著承擔著越來越多的線上業(yè)務的服務,就要求了服務端的穩(wěn)定性,而其中最重要的一點就是服務?;?。有進程終止后自動重啟的能力。
forever
forever是一個簡單的命令行工具,他能確保一個給定的腳本持續(xù)運行。forever完全基于命令行操作,在forever進程之下,創(chuàng)建node的子進程,通過monitor監(jiān)控node子進程的運行情況,一旦文件更新,或者進程掛掉,forever會自動重啟node服務器,確保應用正常運行。
所以就看一下forever的項目吧。主要的進程控制方面的代碼地址。
start方法
let child_process = require('child_process')
let spawn = child_process.spawn
Monitor.prototype.start = function (restart) {
var self = this,
child;
child = this.trySpawn();
...
return this;
};
Monitor.prototype.trySpawn = function () {
var run = this.parser(this.command, this.args.slice()),
stats;
return spawn(run.command, run.args, this.spawnWith);
};
核心就是使用了node api 中的 spawn,創(chuàng)建子進程,這個子進程就是我們真正的需要運行的node端服務。
自動restart
父子進程的通信核心就是為了?;?,主要就是監(jiān)聽了子進程,也就是需要被守護進程的exit事件
child.on('exit', function (code, signal) {
var spinning = Date.now() - self.ctime < self.minUptime;
child.removeListener('message', onMessage);
self.emit('exit:code', code, signal);
function letChildDie() {
self.running = false;
self.forceStop = false;
self.emit('exit', self, spinning);
}
function restartChild() {
self.forceRestart = false;
process.nextTick(function () {
self.start(true);
});
}
self.times++;
if (self.forceStop || (self.times >= self.max && !self.forceRestart)
|| (spinning && typeof self.spinSleepTime !== 'number') && !self.forceRestart) {
letChildDie();
}
else if (spinning) {
setTimeout(restartChild, self.spinSleepTime);
}
else {
restartChild();
}
});
邏輯很簡單,分別兩個場景,一個是希望子進程不要再啟動,一般就是外部控制殺死的;一個是意外退出后的重啟,此處與一個spinning值的判斷,也就是在退出后存在一個重啟的時間間隔。
父子進程通信
message事件來監(jiān)聽,用send方法來發(fā)送事件,父子進程通信就可以用做外部的控制的實現(xiàn)了。這里我們還需要注意一個細節(jié),就是node后端服務運行中會輸出很多的日志,此時放在子進程中的控制臺輸出,如果希望暴露出來就可以使用options.stdio屬性。
總結
保活的場景很多,這里可以使用forever庫來處理,配合監(jiān)控和日志功能,更好的保證線上環(huán)境的穩(wěn)定。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
node.js中實現(xiàn)token的生成與驗證的操作方法
Token是一種用于在客戶端和服務器之間安全傳輸信息的加密字符串,常用于身份驗證、授權、狀態(tài)管理和安全性,在Node.js中,常用jsonwebtoken庫生成和驗證Token,本文介紹node.js中實現(xiàn)token的生成與驗證的操作方法,感興趣的朋友一起看看吧2025-01-01
nodejs利用readline提示輸入內(nèi)容實例代碼
這篇文章主要給大家介紹了關于nodejs利用readline提示輸入內(nèi)容的相關資料,Readline是Node.js里實現(xiàn)標準輸入輸出的封裝好的模塊,通過這個模塊我們可以以逐行的方式讀取數(shù)據(jù)流,需要的朋友可以參考下2021-07-07
node.js實現(xiàn)http服務器與瀏覽器之間的內(nèi)容緩存操作示例
這篇文章主要介紹了node.js實現(xiàn)http服務器與瀏覽器之間的內(nèi)容緩存操作,結合實例形式分析了node.js http服務器與瀏覽器之間的內(nèi)容緩存原理與具體實現(xiàn)技巧,需要的朋友可以參考下2020-02-02
Node.js原理阻塞和EventEmitter及其繼承的運用實戰(zhàn)
這篇文章主要介紹了Node.js原理阻塞和EventEmitter及其繼承的運用實戰(zhàn),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08
npm?install?XXX安裝路徑文件夾權限問題的解決過程
這篇文章主要給大家介紹了關于npm?install?XXX安裝路徑文件夾權限問題(npm?ERR!?The?operation?was?rejected?by?your?operating?system.errno?-4080)的解決過程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-04-04

