91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么提升nodejs的穩定性

發布時間:2022-01-13 17:34:42 來源:億速云 閱讀:212 作者:小新 欄目:web開發

這篇文章主要介紹怎么提升nodejs的穩定性,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

提升nodejs穩定性的方法:1、保持良好的代碼結構;2、使用“try~catch”來捕獲異常;3、使用domain模塊來處理程序的異常;4、使用log4js模塊記錄日志;5、使用forever模塊管理nodejs。

本教程操作環境:windows7系統、nodejs 12.19.0版,DELL G3電腦。

提高nodejs程序的穩定性,健壯性

在網上看到一些帖子,吐糟,質疑nodejs 程序的穩定性,為什么呢?其一,可能這個和javascript有關吧,node是拿javascript去實現的,而javascript又被稱為是“世界上誤解最深的語言”,我們可以去看看nodejs 創始人的說法,可以去看看知乎的這篇文章,為什么node 用javascript去實現,其二,nodejs 畢竟還年輕,而且官網在部分模塊也標注了此模塊的目前的狀態。

這2天我抽了點時間思考了下這個問題,我覺得我們程序首先功能應該是獨立的,就是一個功能出異常了,不應該去影響另外一個正常的功能,不應該將整個程序都崩潰掉,其次,即使是程序崩潰了,我們也應該有一個讓程序自動啟動,另外,應該去記錄日志,方便我們跟蹤問題。我覺得主要可以從以下方面提高nodejs 穩定性:

1)保持良好的代碼結構:

我們知道node是單線程,非阻塞io,默認就是異步,通過回調的方式處理后面的流程,如果嵌套的層次太多了,勢必會引起代碼邏輯結構的混亂,也不利于維護和升級,可以采用async這個異步流程控制模塊,來理清我們的代碼邏輯。

2)使用 process.on('uncaughtException', function(err){...}); 來處理未被捕捉的錯誤。

3)使用try~catch 來捕獲異常:

這個只能解決一部分問題,不是萬能的,在上面說到因為node是單線程,非阻塞io,默認就是異步,通過回調的方式處理后面的流程,try~catch 是不能捕獲的callback 里面的error的錯誤的,怎么捕獲到callback里面的錯誤呢 ? 可以采用domain模塊

4)使用domain模塊來處理程序的異常

先看看對domain的解釋:domain是 EventEmitter類的一個子類。監聽它的error事件來處理它捕捉到的錯誤。 它提供了一種方式,即以一個單一的組的形式來處理多個不同的IO操作。如果任何一個注冊到domain的事件觸發器或回調觸發了一個‘error’事件,或者拋出一個錯誤,那么domain對象將會被通知到。而不是直接讓這個錯誤的上下文從`process.on('uncaughtException')'處理程序中丟失掉,也不會致使程序因為這個錯誤伴隨著錯誤碼立即退出。

如何使用domain 模塊呢?看一個例子:

serverDomain.run(function() {
  // 服務器在serverDomain的作用域內被創建
  http.createServer(function(req, res) {
    // req和res同樣在serverDomain的作用域內被創建
    // 但是,我們想對于每一個請求使用一個不一樣的域。
    // 所以我們首先創建一個域,然后將req和res添加到這個域上。
    var reqd = domain.create();
    reqd.add(req);
    reqd.add(res);
    reqd.on('error', function(er) {
      console.error('Error', er, req.url);
      try {
        res.writeHead(500);
        res.end('Error occurred, sorry.');
      } catch (er) {
        console.error('Error sending 500', er, req.url);
      }
    });
  }).listen(1337);    
});
```

說明:首先創建一個域(domain.create()),然后將需要監控的分發器添加到該域上,最后給域綁定一個錯誤事件,這樣就可以監控了。

再看一個例子:

var d = domain.create();
d.on('error', function(er) {
  console.error('Caught error!', er);
});
d.run(function() {
  process.nextTick(function() {
    setTimeout(function() { // 模擬幾個不同的異步的東西
      fs.open('non-existent file', 'r', function(er, fd) {
        if (er) throw er;
        // 繼續。。。
      });
    }, 100);
  });
});

說明:首先創建一個域,給域綁定一個錯誤事件,然后在域的上下文提供可以運行的函數

如果對于回調呢?可以這么使用

var d = domain.create();

function readSomeFile(filename, cb) {
  fs.readFile(filename, 'utf8', d.bind(function(er, data) {
    // if this throws, it will also be passed to the domain
    return cb(er, data ? JSON.parse(data) : null);
  }));
}

d.on('error', function(er) {
  // an error occurred somewhere.
  // if we throw it now, it will crash the program
  // with the normal line number and stack message.
});

當然也可以這么使用

var d = domain.create();

function readSomeFile(filename, cb) {
  fs.readFile(filename, 'utf8', d.bind(function(er, data) {
    // if this throws, it will also be passed to the domain
    return cb(er, data ? JSON.parse(data) : null);
  }));
}

d.on('error', function(er) {
  // an error occurred somewhere.
  // if we throw it now, it will crash the program
  // with the normal line number and stack message.
});

這個函數與domain.bind(callback)幾乎一模一樣。但是,除了捕捉被拋出的錯誤外,它還會攔截作為第一參數被傳遞到這個函數的Error對象。

5)使用log4js 模塊記錄日志

  log4js 是一個非常強大的日志管理工具,在可以看看github這個項目: https://github.com/nomiddlename/log4js-node

6)使用forever 模塊來管理nodejs

  forever 是服務端管理nodejs 的一個模塊,一個命令行工具,能夠啟動,停止app 應用。forever完全是基于命令行操作,在forever進程管理之下,創建node的子進程,通過monitor監控node子進程的運行情況,一旦文件更新,或者進程掛掉,forever會自動重啟node服務器,確保應用正常運行。非常的好用.

可以關注下這個項目:https://github.com/nodejitsu/forever

但是forever 也不是萬能的,也由下面這些問題:

  • 有限的監控和日志功能

  • 進程管理配置的支持差

  • 不支持集群

  • 代碼庫老化(意味著在升級node.js時頻繁的失敗)

以上是“怎么提升nodejs的穩定性”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

舒城县| 常州市| 和林格尔县| 兖州市| 西藏| 西乡县| 英超| 龙陵县| 田林县| 泾阳县| 合作市| 万州区| 黄骅市| 汕尾市| 冀州市| 恩平市| 三河市| 溧水县| 新和县| 于都县| 蒲江县| 吉木萨尔县| 建水县| 慈利县| 柘城县| 咸宁市| 嘉禾县| 策勒县| 甘德县| 荥经县| 武冈市| 浦城县| 海淀区| 克什克腾旗| 建宁县| 诏安县| 加查县| 曲阜市| 金平| 竹溪县| 探索|