您好,登錄后才能下訂單哦!
引言
目前的項目中使用了node,作為一個簡單的后端服務,隨著承擔著越來越多的線上業務的服務,就要求了服務端的穩定性,而其中最重要的一點就是服務保活。有進程終止后自動重啟的能力。
forever
forever是一個簡單的命令行工具,他能確保一個給定的腳本持續運行。forever完全基于命令行操作,在forever進程之下,創建node的子進程,通過monitor監控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,創建子進程,這個子進程就是我們真正的需要運行的node端服務。
自動restart
父子進程的通信核心就是為了保活,主要就是監聽了子進程,也就是需要被守護進程的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事件來監聽,用send方法來發送事件,父子進程通信就可以用做外部的控制的實現了。這里我們還需要注意一個細節,就是node后端服務運行中會輸出很多的日志,此時放在子進程中的控制臺輸出,如果希望暴露出來就可以使用options.stdio屬性。
總結
保活的場景很多,這里可以使用forever庫來處理,配合監控和日志功能,更好的保證線上環境的穩定。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。