gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:45:30 24 4
gpt4 key购买 nike

我有两个 meteor 应用程序通过不同服务器上的 DDP 连接,服务器 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 失去了 Internet 连接,当服务器 B 重新连接到 Internet 时,服务器 A 上插入的数据不再出现在服务器 B 上。

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

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

更新:重现步骤

我在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");
};

添加此代码后,服务器 b 将在经过足够长的时间后重新连接,而服务器 a 不会对传递心跳方法调用的 TCP 段发出 ACK。在我的机器上,这只需几分钟,我会收到一个 ETIMEDOUT,然后重新连接。

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

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

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