当前位置: 首页 > 面试题库 >

可靠地重新连接到MongoDB

方梓
2023-03-14
问题内容

更新: 我在驱动程序上使用2.1版本,而不是3.2

我有一个使用MongoDB的节点应用程序。我的问题是,如果MongoDB服务器由于任何原因而关闭,则应用程序不会重新连接。为了实现这一点,我基于此官方教程中的代码进行了测试。

var MongoClient = require('mongodb').MongoClient
  , f = require('util').format;

MongoClient.connect('mongodb://localhost:27017/test',

// Optional: uncomment if necessary
// { db: { bufferMaxEntries: 3 } },


function(err, db) {
  var col = db.collection('t');

  setInterval(function() {
    col.insert({a:1}, function(err, r) {
      console.log("insert")
      console.log(err)

      col.findOne({}, function(err, doc) {
        console.log("findOne")
        console.log(err)
      });
    })
  }, 1000)
});

想法是运行此脚本,然后停止mongod,然后重新启动它。所以,我们开始:

将MongoDb停止10秒钟可以达到预期效果:它将停止运行查询10秒钟,然后在服务器返回ip后将运行所有查询。

测试2:停止mongod 30秒

恰好30秒后,我开始得到:

{ [MongoError: topology was destroyed] name: 'MongoError', message: 'topology was destroyed' }
insert

{ [MongoError: topology was destroyed] name: 'MongoError', message: 'topology was destroyed' }

麻烦在于,从此以后,当我重新启动mongod时,连接 没有重新建立

解决方案?

这个问题有解决办法吗?如果是这样,您知道那是什么吗?一旦我的应用开始呕吐“拓扑已被破坏”,使所有内容重新正常工作的唯一方法是重新启动整个应用…


问题答案:

有2个连接选项可控制连接失败后mongo nodejs驱动程序如何重新连接

  • reconnectTries:尝试重新连接#次(默认30次)
  • reconnectInterval:服务器将在两次重试之间等待#毫秒(默认为1000毫秒)

mongo驱动程序文档上的参考

这意味着mongo默认会继续尝试连接30次,并在每次重试前等待1秒。这就是为什么您在30秒后开始看到错误的原因。

您应该根据自己的需要调整这两个参数,例如本示例。

var MongoClient = require('mongodb').MongoClient,
    f = require('util').format;

MongoClient.connect('mongodb://localhost:27017/test', 
    {
        // retry to connect for 60 times
        reconnectTries: 60,
        // wait 1 second before retrying
        reconnectInterval: 1000
    },

    function(err, db) {
        var col = db.collection('t');

        setInterval(function() {
            col.insert({
                a: 1
            }, function(err, r) {
                console.log("insert")
                console.log(err)

                col.findOne({}, function(err, doc) {
                    console.log("findOne")
                    console.log(err)
                });
            })
        }, 1000)
    });

这将尝试60次,而不是默认的30次,这意味着当它停止尝试重新连接时,您将在60秒后开始看到错误。

旁注:如果要阻止应用程序/请求在重新连接期到期之前等待,则必须传递option bufferMaxEntries: 0。这样做的代价是在短暂的网络中断期间请求也会中止。



 类似资料:
  • 问题内容: 用过的 NodeJS,Socket.io 问题 想象有两个用户 U1 和 U2 通过Socket.io连接到应用程序。该算法如下: U1 完全失去Internet连接(例如,关闭Internet) U2 向 U1 发送消息。 U1 尚未收到消息,因为Internet断开 服务器 通过心跳超时检测到 U1 断开连接 U1 重新连接到socket.io U1 从不接收来自 U2 的消息-我

  • NodeJS,socket.io null null 附言。我称之为“消息”的东西不仅仅是可以存储在数据库中的文本消息,而是有价值的系统消息,必须保证交付,否则UI就会出错。 谢了! 我已经有了一个用户帐户系统。而且,我的应用程序已经很复杂了。添加脱机/联机状态没有帮助,因为我已经有了这类东西。问题不一样。 查看步骤2。在这一步上,我们技术上不能说如果U1离线,他只是失去连接,比如说2秒钟,可能是

  • 重新建立mqtt连接,前提是必须已经通过Iot_id,Iot_pwd建立过一次mqtt连接。 请求方式: "|4|1|5|\r" 返回值: "|4|1|1|1|\r" mqtt连接状态:连接成功 "|4|1|1|2|reason|\r" mqtt连接状态:连接失败,字符串reason表示失败的原因 Arduino样例: softSerial.print("|4|1|5|\r");

  • 重新连接上一次连接的wifi。 请求方式: "|2|3|\r" 返回值: "|2|1|\r" wifi连接状态:wifi断开连接 "|2|2|\r" wifi连接状态:正在连接wifi "|2|3|ip|\r" wifi连接状态:wifi连接成功,返回OBLOQ的ip地址 "|2|4|\r" wifi连接状态:wifi连接失败,检查SSID和PWD是否输入正确 Arduino样例: softSer

  • 我在HA模式下配置了Flink,如下所述: 我想测试容错性,因此我做了以下工作: 设置具有2个JobManager和1个TaskManager的Flink群集 在任务管理器上启动流式处理作业 杀死活动的作业管理器(以模拟崩溃) 领导人选举如期举行 但注意到任务管理器正在重新连接到新的作业管理器。它只是每10秒尝试重新连接到前一个领导者 在此处粘贴任务管理器日志: 重新启动任务管理器没有帮助 重新启