mongoose 5.7 使用了mongoDB驅(qū)動3.3.x, 這個驅(qū)動對監(jiān)視副本集和分片集群中所有服務(wù)器的方式進(jìn)行了重大重構(gòu),也就是拓?fù)浣Y(jié)構(gòu)下的服務(wù)發(fā)現(xiàn)與監(jiān)控那婉。
mongoose.set('useUnifiedTopology', true);
useUnifiedTopology設(shè)置為false時
如果選擇不使用useUnifiedTopology,
重連設(shè)置可以依照如下進(jìn)行設(shè)置,那么數(shù)據(jù)庫在異常的情況下,會每隔6m重新嘗試連接mongoDB,直到連接30次并闲,就會報出"reconnectFailed" 的錯誤,可以監(jiān)聽這個事件谷羞,來捕捉錯誤發(fā)出警報
mongoose.connect(myUri, {
useUnifiedTopology: false, // 默認(rèn)是true
reconnectTries: 30, // 默認(rèn)也是30次
reconnectInterval: 6000, //默認(rèn)是1000ms
autoReconnect: true帝火,
})
mongoose.connection.on('reconnectFailed', () => {
logger.error("重試達(dá)到上限")
//sendEmail()
})
useUnifiedTopology設(shè)置為true時
當(dāng)設(shè)置了 useUnifiedTopology: true 后,mongoose關(guān)于重連的設(shè)置參數(shù)就無效了,如下參數(shù)
autoReconnect 是否自動重連
reconnectTries 重連次數(shù)上限
reconnectInterval 重連間隔
這時連接的配置:
const options = {
useNewUrlParser: true,
useUnifiedTopology: true,
serverSelectionTimeoutMS: 30000, // 重試時間湃缎,默認(rèn)30s
socketTimeoutMS: 45000, // Close sockets after 45 seconds of inactivity
};
mongoose.connect(uri, options);
- serverSelectionTimeoutMS- 重試時間:在useUnifiedTopology設(shè)置為true的情況下犀填,mongoDB驅(qū)動會把客戶端操作發(fā)送給查找到的服務(wù)器去,如果出錯嗓违,將保持重試時間為:serverSelectionTimeoutMS
這個重試也會發(fā)生在初始連接:mongoose.connect() 發(fā)生錯誤的時候九巡,如果想更及時的捕獲錯誤的反饋,可以將時間縮短蹂季。 - heartbeatFrequencyMS- 心跳檢查時間冕广,在useUnifiedTopology設(shè)置為true的情況下,mongoDB驅(qū)動會每隔 heartbeatFrequencyMS 發(fā)送一次心跳偿洁,來檢查連接狀態(tài)撒汉,心跳失敗后,將會重試的時間為“serverSelectionTimeoutMS”涕滋,重試失敗后才會發(fā)出
‘disconnected’ 事件睬辐,建議不要把heartbeatFrequencyMS設(shè)置短于1000ms,過多的心跳檢查,將會降低性能
mongoose的useUnifiedTopology設(shè)置為true的情況下,serverSelectionTimeoutMS的重試只持續(xù)短時間溯饵,如果想在這個基礎(chǔ)之上侵俗,再加上重試機(jī)制可以參考:
https://github.com/nestjs/mongoose/blob/master/lib/mongoose-core.module.ts#L62
或者在 disconnect 事件上,加上定時器重試一定次數(shù)丰刊,但一定要記得在連接成功或連接次數(shù)達(dá)到上限時清除定時器坡慌,要不然會使連接數(shù)暴增,拖垮數(shù)據(jù)服務(wù)器
參考文檔: