久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

怎樣讓Nodejs服務(wù)器優(yōu)雅地退出

共計(jì) 2354 個(gè)字符,預(yù)計(jì)需要花費(fèi) 6 分鐘才能閱讀完成。

本篇文章為大家展示了怎樣讓 Nodejs 服務(wù)器優(yōu)雅地退出,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

假設(shè)我們啟動(dòng)了一個(gè)服務(wù)器,接收到了一些客戶(hù)端的請(qǐng)求,這時(shí)候,如果我們想修改一個(gè)代碼發(fā)布,需要重啟服務(wù)器,怎么辦? 假設(shè)我們有以下代碼。

server.js

const net = require(net  const server = net.createServer().listen(80);

client.js

const net = require(net  net.connect({port:80})

如果我們直接殺死進(jìn)程,那么存量的請(qǐng)求就會(huì)無(wú)法正常被處理。這會(huì)影響我們的服務(wù)質(zhì)量。本文介紹如何使 nodejs 在重啟時(shí)優(yōu)雅地退出,所謂優(yōu)雅,即讓 nodejs 進(jìn)程處理完存量請(qǐng)求后再退出。這關(guān)鍵的地方在于 nodejs 提供的 api  server.close()。我們看一下這 api 的介紹。

Stops the server from accepting new connections and keeps existing connections. This function is asynchronous, the server is finally closed when all connections are ended and the server emits a  close  event. The optional callback will be called once the  close  event occurs. Unlike that event, it will be called with an Error as its only argument if the server was not open when it was closed.

當(dāng)我們使用 close 關(guān)閉一個(gè) server 時(shí),server 會(huì)等所有的連接關(guān)閉后才會(huì)觸發(fā) close 事件。我們看一下源碼。

Server.prototype.close = function(cb) { //  觸發(fā)回調(diào)  if (typeof cb ===  function) { if (!this._handle) { this.once( close , function close() { cb(new errors.Error( ERR_SERVER_NOT_RUNNING  }); } else { this.once( close , cb); } } //  關(guān)閉底層資源  if (this._handle) { this._handle.close(); this._handle = null; } //  判斷是否需要立刻觸發(fā) close 事件  this._emitCloseIfDrained(); return this; }; // server 下的連接都 close 后觸發(fā) server 的 close 事件  Server.prototype._emitCloseIfDrained = function() { //  還有連接則先不處理  if (this._handle || this._connections) { return; } const asyncId = this._handle ? this[async_id_symbol] : null; nextTick(asyncId, emitCloseNT, this); }; Socket.prototype._destroy = function(exception, cb) { ... // socket 所屬的 server if (this._server) { // server 下的連接數(shù)減一  this._server._connections--; /*  是否需要觸發(fā) server 的 close 事件,  當(dāng)所有的連接(socket)都關(guān)閉時(shí)才觸發(fā) server 的是 close 事件  */ if (this._server._emitCloseIfDrained) { this._server._emitCloseIfDrained(); } } };

從源碼中我們看到,nodejs 會(huì)先關(guān)閉 server 對(duì)應(yīng)的 handle,所以 server 不會(huì)再接收新的請(qǐng)求了。但是 server 并沒(méi)有觸發(fā) close 事件,而是等到所有連接斷開(kāi)后才觸發(fā) close 事件,這個(gè)通知機(jī)制給了我們一些思路。我們可以監(jiān)聽(tīng) server 的 close 事件,等到觸發(fā) close 事件后才退出進(jìn)程。

const net = require(net  const server = net.createServer().listen(80); server.on(close , () =  { process.exit(); }); //  防止進(jìn)程提前掛掉  process.on(uncaughtException , () =  { }); process.on(SIGINT , function() { server.close(); })

我們首先監(jiān)聽(tīng) SIGINT 信號(hào),當(dāng)我們使用 SIGINT 信號(hào)殺死進(jìn)程時(shí),首先調(diào)用 server.close,等到所有的連接斷開(kāi),觸發(fā) close 時(shí)候時(shí),再退出進(jìn)程。我們首先開(kāi)啟服務(wù)器,然后開(kāi)啟兩個(gè)客戶(hù)端。接著按下 ctrl+c,我們發(fā)現(xiàn)這時(shí)候服務(wù)器不會(huì)退出,然后我們關(guān)閉兩個(gè)客戶(hù)端,這時(shí)候 server 就會(huì)優(yōu)雅地退出。

上述內(nèi)容就是怎樣讓 Nodejs 服務(wù)器優(yōu)雅地退出,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-16發(fā)表,共計(jì)2354字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 邵阳市| 泾源县| 祁门县| 于都县| 西和县| 阿克苏市| 信宜市| 宁化县| 林口县| 石景山区| 南昌市| 洱源县| 丹江口市| 东乡| 溧水县| 富民县| 敦化市| 称多县| 东海县| 玉山县| 湘潭县| 龙里县| 隆尧县| 扎兰屯市| 平乐县| 饶平县| 达孜县| 天峨县| 旺苍县| 册亨县| 兴业县| 新蔡县| 闽侯县| 海淀区| 奈曼旗| 扎兰屯市| 盐津县| 胶州市| 盐池县| 海门市| 皋兰县|