更新: 我在驱动程序上使用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后将运行所有查询。
恰好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驱动程序如何重新连接
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秒尝试重新连接到前一个领导者 在此处粘贴任务管理器日志: 重新启动任务管理器没有帮助 重新启