摘要:個人認為,這種方式相比一直等待數(shù)據(jù)庫重連直到響應(yīng)超時體驗要更佳一點。當(dāng)然,以上這套最佳實踐還存在一個不足如果服務(wù)初次啟動后未能成功連接數(shù)據(jù)庫比如數(shù)據(jù)庫此時處于宕機狀態(tài),則服務(wù)不會嘗試重連數(shù)據(jù)庫。
關(guān)于如何處理 node.js 服務(wù)連接 MongoDB,我查閱了大量中英文資料,發(fā)現(xiàn)并沒有太適合我所期望的能力的方案,因此經(jīng)過一番官方文檔的研究,總結(jié)了以下的連接 MongoDB 的方法(使用目前 Node.js 平臺最常用的 MongoDB ODM mongoose),斗膽稱之為『最佳實踐』,希望能夠拋磚引玉,得到大家更專業(yè)的解答。
話不多說,先上代碼:
const mongoose = require("mongoose") const config = require("./config") if (process.env.NODE_ENV === "development") { mongoose.set("debug", true) /* A */ } mongoose.set("bufferCommands", false) /* B */ function connectMongoDB(address) { try { mongoose.connect(address, { useNewUrlParser: true, bufferMaxEntries: 0 /* B */ autoReconnect: true /* C, default is true, you can ignore it */ poolSize: 5 /* D, default is 5, you can ignore it */ }) const db = mongoose.connection db.on("error", (error) => { console.log(`MongoDB connecting failed: ${error}`) }) db.once("open", () => { console.log("MongoDB connecting succeeded") }) return db } catch (error) { console.log(`MongoDB connecting failed: ${error}`) } } const mongoInstance = connectMongoDB(config.database.mongo) module.exports = { mongoInstance }
這套連接方法能夠滿足以下需求,當(dāng)然,這也是從我的服務(wù)需要滿足的需求中總結(jié)而來的:
開發(fā)環(huán)境下能夠打印詳細的數(shù)據(jù)庫操作信息
與數(shù)據(jù)庫斷開連接后,所有涉及到數(shù)據(jù)庫讀寫操作的命令均會立即返回錯誤,而不會等待重連進而造成接口超時
服務(wù)啟動并成功與數(shù)據(jù)庫建立連接后,如果數(shù)據(jù)庫出現(xiàn)問題造成連接中斷,服務(wù)會自動嘗試重連直到連接成功
無需手動處理連接數(shù)
我們逐條來看每個需求對應(yīng)的配置:
1.見注釋 A,在開發(fā)環(huán)境中設(shè)置 "debug" 為 true,數(shù)據(jù)庫將會把集合方法和參數(shù)打印到控制臺。
2.見兩處注釋 B,這里貼一段 mongoose 文檔中對 bufferMaxEntries 的解釋:
bufferMaxEntries - The MongoDB driver also has its own buffering mechanism that kicks in when the driver is disconnected. Set this option to 0 and set bufferCommands to false on your schemas if you want your database operations to fail immediately when the driver is not connected, as opposed to waiting for reconnection.
核心意思就是將 bufferMaxEntries 設(shè)為 0 同時將 bufferCommands 設(shè)為 false,可以讓驅(qū)動在未連接到數(shù)據(jù)庫的時候,操作立即返回失敗,而不是一直在等待重連。個人認為,這種方式相比一直等待數(shù)據(jù)庫重連直到響應(yīng)超時體驗要更佳一點。
3.見注釋 C,這實際上是 mongoose 的默認設(shè)置,其連接數(shù)據(jù)庫時的 config 參數(shù) autoReconnect 默認為 true,其含義見文檔:
autoReconnect - The underlying MongoDB driver will automatically try to reconnect when it loses connection to MongoDB. Unless you are an extremely advanced user that wants to manage their own connection pool, do not set this option to false.
如果非高級用戶,就不要去改變這個參數(shù)了。
4.見注釋 D。對于 MongoDB 連接池的問題,建議是不要去手動處理。mongoose 自己會維護一個默認最大數(shù)量為 5 的連接池,只有當(dāng)你發(fā)現(xiàn)有一些慢查詢可能阻塞快查詢時才應(yīng)該考慮增大 poolSize。當(dāng)然,這個數(shù)字不能設(shè)置得過大,MongoDB 默認是一個連接啟動一個線程來服務(wù),連接太多線程數(shù)切換系統(tǒng)開銷會很大。
當(dāng)然,以上這套『最佳實踐』還存在一個不足:如果服務(wù)初次啟動后未能成功連接數(shù)據(jù)庫(比如數(shù)據(jù)庫此時處于宕機狀態(tài)),則服務(wù)不會嘗試重連數(shù)據(jù)庫。解決方法也不是沒有,就是比較雞肋:在 mongoose 連接的 "error" 事件監(jiān)聽回調(diào)函數(shù)中嘗試重連。但是需要設(shè)置最大重試次數(shù),否則會發(fā)生內(nèi)存泄露。比較雞肋的原因是,如果首次連接沒有成功,短時間內(nèi)嘗試重連幾次貌似也無濟于事。因此,使用這套連接方式務(wù)必要注意數(shù)據(jù)庫保持可連接狀態(tài)。或者讀者們?nèi)绻懈玫慕鉀Q方案,也希望能不吝賜教。
完。
本文首發(fā)于我的博客(點此查看),歡迎關(guān)注。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/19403.html
摘要:一默認使用的模塊化方案,默認是的模塊化方案,兩者有本質(zhì)區(qū)別。的去尋找引入的依賴時,如果是自帶的模塊,比如文件模塊,只需要填寫即可。這是版本入口文件使用了兩個路由器路由,分別處理和請求邏輯。核心操作全部依賴模型對象來執(zhí)行。 一、Node.js默認使用commonJs的模塊化方案,TypeScript默認是ES6的模塊化方案,兩者有本質(zhì)區(qū)別。 1.Node.js的去尋找引入的依賴時,如果...
摘要:一默認使用的模塊化方案,默認是的模塊化方案,兩者有本質(zhì)區(qū)別。的去尋找引入的依賴時,如果是自帶的模塊,比如文件模塊,只需要填寫即可。這是版本入口文件使用了兩個路由器路由,分別處理和請求邏輯。核心操作全部依賴模型對象來執(zhí)行。 一、Node.js默認使用commonJs的模塊化方案,TypeScript默認是ES6的模塊化方案,兩者有本質(zhì)區(qū)別。 1.Node.js的去尋找引入的依賴時,如果...
摘要:一默認使用的模塊化方案,默認是的模塊化方案,兩者有本質(zhì)區(qū)別。的去尋找引入的依賴時,如果是自帶的模塊,比如文件模塊,只需要填寫即可。這是版本入口文件使用了兩個路由器路由,分別處理和請求邏輯。核心操作全部依賴模型對象來執(zhí)行。 一、Node.js默認使用commonJs的模塊化方案,TypeScript默認是ES6的模塊化方案,兩者有本質(zhì)區(qū)別。 1.Node.js的去尋找引入的依賴時,如果...
摘要:異步最佳實踐避免回調(diào)地獄前端掘金本文涵蓋了處理異步操作的一些工具和技術(shù)和異步函數(shù)。 Nodejs 連接各種數(shù)據(jù)庫集合例子 - 后端 - 掘金Cassandra Module: cassandra-driver Installation ... 編寫 Node.js Rest API 的 10 個最佳實踐 - 前端 - 掘金全文共 6953 字,讀完需 8 分鐘,速讀需 2 分鐘。翻譯自...
摘要:是一種設(shè)計用于關(guān)系型數(shù)據(jù)庫的查詢語言。另一方面,數(shù)據(jù)庫在最近十年變得相當(dāng)流行。大多數(shù)數(shù)據(jù)庫都有驅(qū)動程序可以用,它們在上也有庫。我們已經(jīng)完成了在中使用數(shù)據(jù)庫所必須知道的所有基礎(chǔ)知識。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1751原文:https://blog.risingstack.com/node-js-database-t...
閱讀 2902·2021-11-25 09:43
閱讀 2320·2021-11-24 09:39
閱讀 2708·2021-09-23 11:51
閱讀 1400·2021-09-07 10:11
閱讀 1448·2019-08-27 10:52
閱讀 1929·2019-08-26 12:13
閱讀 3355·2019-08-26 11:57
閱讀 1393·2019-08-26 11:31