mongoose5.7 重连设置

mongoose 5.7 使用了mongoDB驱动3.3.x, 这个驱动对监视副本集和分片集群中所有服务器的方式进行了重大重构,也就是拓扑结构下的服务发现与监控。

mongoose.set('useUnifiedTopology', true);

useUnifiedTopology设置为false时

如果选择不使用useUnifiedTopology,
重连设置可以依照如下进行设置,那么数据库在异常的情况下,会每隔6m重新尝试连接mongoDB,直到连接30次,就会报出"reconnectFailed" 的错误,可以监听这个事件,来捕捉错误发出警报

mongoose.connect(myUri, {
  useUnifiedTopology: false, // 默认是true
  reconnectTries: 30, // 默认也是30次
  reconnectInterval: 6000, //默认是1000ms
  autoReconnect: true,
})
mongoose.connection.on('reconnectFailed', () => {
      logger.error("重试达到上限")
      //sendEmail()
    })

useUnifiedTopology设置为true时

当设置了 useUnifiedTopology: true 后,mongoose关于重连的设置参数就无效了,如下参数

autoReconnect 是否自动重连
reconnectTries 重连次数上限
reconnectInterval 重连间隔

这时连接的配置:

const options = {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  serverSelectionTimeoutMS: 30000, // 重试时间,默认30s
  socketTimeoutMS: 45000, // Close sockets after 45 seconds of inactivity
};
mongoose.connect(uri, options);
  • serverSelectionTimeoutMS- 重试时间:在useUnifiedTopology设置为true的情况下,mongoDB驱动会把客户端操作发送给查找到的服务器去,如果出错,将保持重试时间为:serverSelectionTimeoutMS
    这个重试也会发生在初始连接:mongoose.connect() 发生错误的时候,如果想更及时的捕获错误的反馈,可以将时间缩短。
  • heartbeatFrequencyMS- 心跳检查时间,在useUnifiedTopology设置为true的情况下,mongoDB驱动会每隔 heartbeatFrequencyMS 发送一次心跳,来检查连接状态,心跳失败后,将会重试的时间为“serverSelectionTimeoutMS”,重试失败后才会发出
    ‘disconnected’ 事件,建议不要把heartbeatFrequencyMS设置短于1000ms,过多的心跳检查,将会降低性能

mongoose的useUnifiedTopology设置为true的情况下,serverSelectionTimeoutMS的重试只持续短时间,如果想在这个基础之上,再加上重试机制可以参考:
https://github.com/nestjs/mongoose/blob/master/lib/mongoose-core.module.ts#L62

或者在 disconnect 事件上,加上定时器重试一定次数,但一定要记得在连接成功或连接次数达到上限时清除定时器,要不然会使连接数暴增,拖垮数据服务器

参考文档:

  1. https://stackoverflow.com/questions/59465758/how-to-set-auto-reconnect-with-unified-topology
  2. https://mongoosejs.com/docs/connections.html#options
  3. https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.rst

你可能感兴趣的:(mongoose5.7 重连设置)