gpt4 book ai didi

meteor - 两台服务器之间的 DDP 不会重新连接

转载 作者:行者123 更新时间:2023-12-02 04:47:04 25 4
gpt4 key购买 nike

我在不同的服务器上通过 DDP 连接了两个 meteor 应用程序,服务器 A 将数据发送到服务器 B。这就是它们的工作方式。

服务器A

Items = new Meteor.Collection('items');
Items.insert({name: 'item 1'});
if (Meteor.isServer) {
Meteor.publish('items', function() {
return Items.find();
});
}

服务器 B

var remote = DDP.connect('http://server-a/');
Items = new Meteor.Collection('items', remote);

remote.subscribe('items');
Items.find().observe({
added: function(item) {
console.log(item);
}
});

每次我在服务器 A 上调用 Items.insert(something) 时,在服务器 B 上我都会在控制台上获得一个日志,其中包含我在服务器 A 上保存的对象。但是如果服务器 B 失去了互联网连接,当服务器 B 重新连接到 Internet 时,服务器 A 上插入的数据不再出现。

服务器 B 通过路由器连接到 Internet。只有当我断开并重新连接路由器时才会出现此问题,而不是当我从路由器断开并重新连接服务器时。两台服务器位于不同的网络上并通过 Internet 连接。

我在服务器 B 上创建了一个调用 remote.status() 的计时器,但总是得到 { status: 'connected', connected: true, retryCount: 0 } 当与 Internet 连接或断开连接。

更新:重现步骤

我用测试代码在github上创建了一个项目https://github.com/camilosw/ddp-servers-test .服务器 A 安装在 http://ddpserverstest-9592.onmodulus.net/

我的电脑通过 radio 缆调制解调器连接到互联网。

  1. 在 server-b 文件夹上运行 mrt
  2. 转到 http://ddpserverstest-9592.onmodulus.net/然后单击链接插入(您可以单击删除以删除所有以前的插入)。您必须在本地控制台上看到一条消息,其中包含添加的项目。
  3. 关闭计算机上的无线并再次单击插入链接。 (您需要在另一台可以上网的电脑上点击,我用智能手机点击链接)
  4. 打开计算机上的无线网络。您必须在本地控制台上看到一条包含第二项的消息。
  5. 现在,关闭电缆调制解调器并再次单击插入链接。
  6. 打开电缆调制解调器。这一次,新项目没有出现在控制台上。

我还使用 Android 智能手机完成了此操作,使用了通过无线方式将互联网共享到我的计算机的选项。首先,我关闭并打开计算机上的无线网络,然后正常工作。然后我关闭并打开智能手机上的互联网连接,我遇到了同样的问题。

更新 2

我办公室有两个无线路由器。我发现如果我在路由器之间移动,也会发生同样的问题。

最佳答案

来自 Meteor 团队的 Emily Stark 确认这是由于当前实现中缺少一个功能(我写这个答案时版本为 0.7.0.1)。他们的答案在这里https://github.com/meteor/meteor/issues/1543 .以下是他们的回答和她建议的解决方法:

服务器到服务器的连接没有重新连接,因为 Meteor 目前没有对服务器到服务器的 DDP 连接进行任何检测。就像在任何其他 TCP 连接中一样,一旦您切换到不同的路由器,连接上将无法发送或接收任何数据,但客户端不会注意到,除非它尝试发送一些数据并超时。这不同于在 SockJS 上运行的浏览器到服务器 DDP 连接。 SockJS 有自己的心跳,我们可以用它来检测死连接。

要查看实际效果,这里是我在您的示例中添加到 server-b 的一些代码:

var heartbeatOutstanding = false;
Meteor.setInterval(function () {
if (! heartbeatOutstanding) {
console.log("Sending heartbeat");
remote.call("heartbeat", function () {
console.log("Heartbeat returned");
heartbeatOutstanding = false;
});
heartbeatOutstanding = true;
}
}, 3000);

remote.onReconnect = function () {
console.log("RECONNECTING REMOTE");
};

在其中添加此代码后,server-b 将在足够长的时间过去后重新连接,而没有来自 server-a 的 ACK 用于传递心跳方法调用的 TCP 段。在我的机器上,这只是几分钟,我得到一个 ETIMEDOUT,然后重新连接。

我已经打开了一个单独的任务,让我们考虑在下一个错误周期间在服务器到服务器 DDP 连接上实现心跳。同时,您始终可以在您的应用程序中实现检测信号,以确保在客户端无法再与服务器通信时发生 DDP 重新连接。

关于meteor - 两台服务器之间的 DDP 不会重新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19594348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com