嫩草影院久久99_老司机午夜网站国内精品久久久久久久久_久久夜色精品国产_国产一级做a爰片久久毛片

NodeJS服務(wù)總是崩潰的解決辦法

2020-3-23    seo達人

許多人都有這樣一種映像,NodeJS比較快; 但是因為其是單線程,所以它不穩(wěn)定,有點不安全,不適合處理復(fù)雜業(yè)務(wù); 它比較適合對并發(fā)要求比較高,而且簡單的業(yè)務(wù)場景。 

在Express的作者的TJ Holowaychuk的 告別Node.js一文中列舉了以下罪狀: 

Farewell NodeJS (TJ Holowaychuk) 

?   you may get duplicate callbacks 
?   you may not get a callback at all (lost in limbo) 
?   you may get out-of-band errors 
?   emitters may get multiple “error” events 
?   missing “error” events sends everything to hell 
?   often unsure what requires “error” handlers 
?   “error” handlers are very verbose 
?   callbacks suck 

其實這幾條主要吐嘈了兩點: node.js錯誤處理很扯蛋,node.js的回調(diào)也很扯蛋。

 

 

事實上呢?

 


事實上NodeJS里程確實有“脆弱”的一面,單線程的某處產(chǎn)生了“未處理的”異常確實會導(dǎo)致整個Node.JS的崩潰退出,來看個例子, 這里有一個node-error.js的文件: 

 

var http = require('http');

var server = http.createServer(function (req, res) {

  //這里有個錯誤,params 是 undefined
  var ok = req.params.ok;

  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World
');
});

server.listen(8080, '127.0.0.1');

console.log('Server running at http://127.0.0.1:8080/');


啟動服務(wù),并在地址欄測試一下發(fā)現(xiàn) http://127.0.0.1:8080/  不出所料,node崩潰了 


 

$ node node-error
Server running at http://127.0.0.1:8080/

c:githubscript
ode-error.js:5
  var ok = req.params.ok;
                     ^
TypeError: Cannot read property 'ok' of undefined
    at Server.<anonymous> (c:githubscript
ode-error.js:5:22)
    at Server.EventEmitter.emit (events.js:98:17)
    at HTTPParser.parser.onIncoming (http.js:2108:12)
    at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23)
    at Socket.socket.ondata (http.js:1966:22)
    at TCP.onread (net.js:525:27)



 

怎么解決呢?


其實Node.JS發(fā)展到今天,如果連這個問題都解決不了,那估計早就沒人用了。 

 

使用uncaughtException


我們可以uncaughtException來全局捕獲未捕獲的Error,同時你還可以將此函數(shù)的調(diào)用棧打印出來,捕獲之后可以有效防止node進程退出,如: 

 

process.on('uncaughtException', function (err) {
  //打印出錯誤
  console.log(err);
  //打印出錯誤的調(diào)用棧方便調(diào)試
  console.log(err.stack);
});


這相當(dāng)于在node進程內(nèi)部進行守護, 但這種方法很多人都是不提倡的,說明你還不能完全掌控Node.JS的異常。 

 

使用 try/catch


我們還可以在回調(diào)前加try/catch,同樣確保線程的安全。 

 

var http = require('http');

http.createServer(function(req, res) {
  try {
    handler(req, res);
  } catch(e) {
    console.log('
', e, '
', e.stack);
    try {
      res.end(e.stack);
    } catch(e) { }
  }
}).listen(8080, '127.0.0.1');

console.log('Server running at http://127.0.0.1:8080/');

var handler = function (req, res) {
  //Error Popuped
  var name = req.params.name;

  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello ' + name);
};


這種方案的好處是,可以將錯誤和調(diào)用棧直接輸出到當(dāng)前發(fā)生的網(wǎng)頁上。 

 

集成到框架中


標準的HTTP響應(yīng)處理會經(jīng)歷一系列的Middleware(HttpModule),最終到達Handler,如下圖所示: 

\ 


這 些Middleware和Handler在NodeJS中都有一個特點,他們都是回調(diào)函數(shù),而回調(diào)函數(shù)中是唯一會讓Node在運行時崩潰的地方。根據(jù)這個 特點,我們只需要在框架中集成一處try/catch就可以相對完美地解決異常問題,而且不會影響其它用戶的請求request。 

事實上現(xiàn)在的NodeJS WEB框架幾乎都是這么做的,如 OurJS開源博客所基于的 WebSvr 

就有這么一處異常處理代碼: 

 

Line: 207

  try {
    handler(req, res);
  } catch(err) {
    var errorMsg
      = '
'
      + 'Error ' + new Date().toISOString() + ' ' + req.url
      + '
'
      + err.stack || err.message || 'unknow error'
      + '
'
      ;

    console.error(errorMsg);
    Settings.showError
      ? res.end('<pre>' + errorMsg + '</pre>')
      : res.end();
  }


那么不在回調(diào)中產(chǎn)生的錯誤怎么辦?不必擔(dān)心,其實這樣的node程序根本就起不起來。 

此外node自帶的 cluster 也有一定的容錯能力,它跟nginx的worker很類似,但消耗資源(內(nèi)存)略大,編程也不是很方便,OurJS并沒有采用此種設(shè)計。 

 

守護NodeJS進程和記錄錯誤日志


現(xiàn) 在已經(jīng)基本上解決了Node.JS因異常而崩潰的問題,不過任何平臺都不是100%可靠的,還有一些錯誤是從Node底層拋出的,有些異常 try/catch和uncaughtException都無法捕獲。之前在運行ourjs的時侯,會偶爾碰到底層拋出的文件流讀取異常,這就是一個底層 libuv的BUG,node.js在0.10.21中進行了修復(fù)。 

面對這種情況,我們就應(yīng)該為nodejs應(yīng)用添加守護進程,讓NodeJS遭遇異常崩潰以后能馬上復(fù)活。 

另外,還應(yīng)該把這些產(chǎn)生的異常記錄到日志中,并讓異常永遠不再發(fā)生。 

 

使用node來守護node


node-forever 提供了守護的功能和LOG日志記錄功能。 

安裝非常容易 

 

[sudo] npm install forever


使用也很簡單 

 

$ forever start simple-server.js
$ forever list
  [0] simple-server.js [ 24597, 24596 ]


還可以看日志 

 

forever -o out.log -e err.log my-script.js


 

使用shell啟動腳本守護node


使用node來守護的話資源開銷可能會有點大,而且也會略顯復(fù)雜,OurJS直接在開機啟動腳本來進程線程守護。 

如在debian中放置的 ourjs 開機啟動文件: /etc/init.d/ourjs 

這個文件非常簡單,只有啟動的選項,守護的核心功能是由一個無限循環(huán) while true; 來實現(xiàn)的,為了防止過于密集的錯誤阻塞進程,每次錯誤后間隔1秒重啟服務(wù) 

 

WEB_DIR='/var/www/ourjs'
WEB_APP='svr/ourjs.js'

#location of node you want to use
NODE_EXE=/root/local/bin/node

while true; do
    {
        $NODE_EXE $WEB_DIR/$WEB_APP config.magazine.js
        echo "Stopped unexpected, restarting 

"
    } 2>> $WEB_DIR/error.log
    sleep 1
done


 

錯誤日志記錄也非常簡單,直接將此進程控制臺當(dāng)中的錯誤輸出到error.log文件即可: 2>> $WEB_DIR/error.log  這一行, 2 代表 Error。

日歷

鏈接

個人資料

藍藍設(shè)計的小編 http://m.sdgs6788.com

存檔

嫩草影院久久99_老司机午夜网站国内精品久久久久久久久_久久夜色精品国产_国产一级做a爰片久久毛片
<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • 欧美国产专区| 国产在线观看一区| 亚洲精品1234| 日韩视频精品在线观看| 亚洲国产精品v| 一区二区视频免费完整版观看| 久久久999精品| 美国十次成人| 欧美a一区二区| 午夜视频一区二区| 久久久噜久噜久久综合| 9久草视频在线视频精品| 亚洲欧美制服中文字幕| 亚洲国产1区| 亚洲无亚洲人成网站77777| 激情综合电影网| 欧美大片91| 国产欧美日韩视频| 欧美黄色一区| 国产精品一级| 亚洲欧洲在线观看| 国内一区二区三区| 99国内精品久久久久久久软件| 国产欧美日韩在线| 亚洲国产欧美在线人成| 国产视频亚洲精品| 日韩午夜激情av| 亚洲国产精品一区二区www| 中日韩美女免费视频网站在线观看| 在线观看成人网| 亚洲综合欧美日韩| 一本色道久久综合亚洲精品不卡| 老司机精品久久| 亚洲网友自拍| 久久漫画官网| 久久久噜噜噜久久人人看| 国产精品爱啪在线线免费观看 | 欧美男人的天堂| 蜜臀91精品一区二区三区| 国产精品免费看片| 亚洲美女色禁图| 亚洲精品乱码久久久久久日本蜜臀| 久久国产精品网站| 欧美福利影院| 国产日韩专区| 亚洲午夜av| 亚洲午夜黄色| 欧美日韩一区二区视频在线 | 国产精品一二三| 一本到12不卡视频在线dvd| 亚洲国产一区二区精品专区| 久久久久青草大香线综合精品| 女女同性女同一区二区三区91| 亚洲精品免费在线播放| 亚洲天堂免费在线观看视频| 黄色一区二区在线| 一区二区激情视频| 国语精品中文字幕| 99精品免费| 欧美日韩高清在线| 久久精品青青大伊人av| 韩国福利一区| 久久手机免费观看| 国产精品日韩久久久| 久久超碰97中文字幕| 欧美国产第一页| 久久久蜜桃一区二区人| 亚洲免费av电影| 欧美激情中文字幕乱码免费| 亚洲国产精品www| 亚洲剧情一区二区| 亚洲人线精品午夜| 欧美精品videossex性护士| 久久九九国产精品| 亚洲国产老妈| 久久国产精品99国产精| 欧美国产亚洲另类动漫| 久久国产一区二区| 国产精品二区影院| 亚洲国产日本| 亚洲国产视频a| 久久国产精品久久精品国产| 性久久久久久| 欧美午夜精品久久久久久久 | 欧美好骚综合网| 国产在线日韩| 麻豆九一精品爱看视频在线观看免费| 国产亚洲女人久久久久毛片| 亚洲精品女av网站| 国产一区二区三区黄视频| 一区二区三区 在线观看视频| 亚洲七七久久综合桃花剧情介绍| 午夜国产精品影院在线观看| 亚洲精品日日夜夜| 久久久www| 久久婷婷色综合| 国产在线播放一区二区三区 | 国产伦精品一区二区三区四区免费 | 国产精品入口尤物| 一二三区精品福利视频| 99精品国产高清一区二区| 美女网站久久| 嫩模写真一区二区三区三州| 国产一区二区丝袜高跟鞋图片| 亚洲一区三区电影在线观看| 午夜国产精品视频| 国产女优一区| 亚洲欧美日韩系列| 久久精品国产免费看久久精品| 国产在线国偷精品产拍免费yy| 久久国产日本精品| 午夜精品视频网站| 国产一区二区av| 久久精品国产999大香线蕉| 久久九九热免费视频| 国内精品久久久久久久果冻传媒 | 国产一区二区三区视频在线观看| 性欧美精品高清| 久久青草久久| 91久久在线播放| 欧美少妇一区| 国产精品国产三级国产专播精品人 | 亚洲国产高清在线观看视频| 亚洲毛片av在线| 欧美性生交xxxxx久久久| 亚洲欧美日本日韩| 美玉足脚交一区二区三区图片| 亚洲精品视频在线观看免费| 欧美日韩亚洲一区三区| 性久久久久久久| 久久国产一区二区| 日韩亚洲欧美一区二区三区| 欧美日韩精品二区第二页| 亚洲欧美国产va在线影院| 欧美aa在线视频| 中文欧美在线视频| 国产在线精品自拍| 欧美日韩高清一区| 久久99在线观看| 99人久久精品视频最新地址| 欧美在线视频一区二区| 最近中文字幕日韩精品| 国产精品视频内| 欧美国产在线电影| 性欧美1819sex性高清| 极品尤物av久久免费看| 欧美一区二区三区视频在线 | 麻豆精品网站| 99视频在线精品国自产拍免费观看| 欧美一区二区三区免费大片| 亚洲高清一区二| 国产日韩欧美综合在线| 欧美日韩国内自拍| 久久天堂精品| 新67194成人永久网站| 99视频精品全部免费在线| 欧美国产大片| 欧美在线视频不卡| 亚洲欧美三级在线| 亚洲三级免费电影| 韩国久久久久| 国产精品地址| 欧美日韩国产精品一区二区亚洲| 久久精品91| 亚洲一区二区三区精品视频| 亚洲国产一区视频| 欧美88av| 麻豆精品在线观看| 欧美一区二区在线免费播放| 亚洲一区视频| 日韩视频在线一区| 亚洲国产精品久久91精品| 国产一区二区三区久久| 国产精品美女久久久久aⅴ国产馆| 欧美精品videossex性护士| 欧美成人自拍| 欧美国产在线视频| 欧美美女福利视频| 欧美另类在线观看| 欧美精品久久99久久在免费线| 美国成人毛片| 欧美二区在线观看| 欧美韩国日本综合| 欧美激情久久久久| 亚洲黄色成人网| 欧美另类高清视频在线| 欧美国产精品va在线观看| 欧美激情a∨在线视频播放| 久久综合久色欧美综合狠狠| 久久久久久久综合狠狠综合| 久久亚洲精选| 午夜精品www| 久久久国产精品亚洲一区| 久久精品99无色码中文字幕| 亚洲欧美激情在线视频| 亚洲一级黄色| 欧美中文字幕不卡| 久久中文字幕一区二区三区| 一本在线高清不卡dvd| 欧美在线亚洲在线|