Javascript 跟踪涉及Meteor和多个DDP连接的内存泄漏

Javascript 跟踪涉及Meteor和多个DDP连接的内存泄漏,javascript,memory,meteor,memory-leaks,ddp,Javascript,Memory,Meteor,Memory Leaks,Ddp,我有一个运行Meteor v1.5.4.2的多个“节点”网络(由于依赖关系)。这些节点中的每一个都应该能够与其他节点通信以获取统计信息等。这是通过在节点上使用Meteors ddp客户端服务器端完成的,这些节点应该从其他节点获取信息 这似乎很有效,但当我们开始用网络中的大量变化(意味着大量的连接来来去去去)来刺激它时,记忆逐渐积累,直到它冻结并崩溃。我解决内存泄漏的经验有限,但通过查看堆快照,我发现有一个称为“连接”的对象(粘贴在下面)。在字符串下,我还发现许多字符串包含DDP连接中使用的证书和

我有一个运行Meteor v1.5.4.2的多个“节点”网络(由于依赖关系)。这些节点中的每一个都应该能够与其他节点通信以获取统计信息等。这是通过在节点上使用Meteors ddp客户端服务器端完成的,这些节点应该从其他节点获取信息

这似乎很有效,但当我们开始用网络中的大量变化(意味着大量的连接来来去去去)来刺激它时,记忆逐渐积累,直到它冻结并崩溃。我解决内存泄漏的经验有限,但通过查看堆快照,我发现有一个称为“连接”的对象(粘贴在下面)。在字符串下,我还发现许多字符串包含DDP连接中使用的证书和CRL,这使我相信我的代码在连接处理方面存在问题。我试着列出下面的要点,去掉了很多小逻辑

我有点不知道如何进一步处理这个问题,所以任何建议、想法或想法都是非常受欢迎的

提前谢谢

这里是一个压缩运行如何连接它

if(Meteor.isServer){
connectionHandler=新的DDPConnectionHandler();
Meteor.setInterval(()=>connectionHandler.checkNodeConnections(),5000);
}
export const DDPConnectionHandler=function(){
this.connections=[];
this.checkNodeConnections=()=>{
//在此.connections中添加或删除节点连接的逻辑
//要处理的循环pr.节点
const node={…}//要添加/删除的节点的详细信息
//添加新连接
this.connections.push(新的DDP连接(节点));
//删除连接
const index=currentConnections.indexOf(node.id);
this.connections[index].disconnect();
这是连接件拼接(索引1);
};
}
export const DDPConnection=函数(节点){
让自我=这个;
//设置要使用的变量、pw、用户、url…等。
this.connection=DDP.connect(url,{/*证书等,用于SSL*/});
this.connection.call(“login”,{/*登录详细信息*/},(错误,结果)=>{
如果(!错误){
//换行超时以分隔stats调用
Meteor.setTimeout(()=>{self.initNodeStats();},randomNumber);
}否则{/*不走运*/}
});
this.disconnect=()=>{
this.connection.disconnect();//也尝试了.close()方法
};
this.subscribe=(集合)=>{
//函数获取其他数据
};
//初始化并开始从当前外部nde接收默认基准NDEstats
this.initNodeStats=()=>{this.getStats();};
this.getStats=()=>{
call('getStats',{},(错误,结果)=>{
如果(错误){/*没有运气*/
}else if(result){/*将数据传递给处理程序*/}
});
}
}
连接
_流::ClientStream
__原型:对象
_outstandingMethodBlocks::数组
__flushBufferedWrites::()
映射::系统/映射
_methodInvokers::对象
属性::(对象属性)[]
_bufferedWritesFlushAt::系统/异常
_bufferedWritesFlushHandle::system/Oddball
_lastSessionId::系统/古怪
_retryMigrate::系统/古怪
_userId::system/Oddball
_版本::系统/古怪
_版本建议::系统/古怪
onReconnect::系统/古怪
_SupportedDpVersions::Array
_userIdDeps::Tracker.Dependency
_bufferedWrites::对象
_documentsWrittenByStub::对象
_methodHandlers::对象
_方法锁定静止::对象
_serverDocuments::对象
_存储::对象
_SubBeingReserved::对象
_订阅::对象
_updatesForUnknownStores::对象
_afterUpdateCallbacks::Array
_MessagesBufferedUntilQuiese::数组
_resetStores::系统/古怪
挖掘更多信息后更新。

我似乎在连接对象的“\u outstandingMethodBlocks”属性中得到了“方法”的累积。第129行定义如下:


也许我可以使用一些超时设置来阻止它们存储在那里?

这里只是一个架构问题-真的有必要让您的服务器处理所有远程连接吗?谢谢您的关注。这是一组分布式服务器,服务器动态地进出。有了可用的资源和时间,决定在需要时使用现有的通信层获取数据。因此,某些用户登录到其中一台服务器时,会促使该服务器从其他服务器获取数据。你想在哪里有一个独立的系统将数据分发到Meteor之外?这可能是以后的另一种选择,但现在我需要让它发挥作用。问题似乎是连接对象在我不需要它们之后仍然存在。您可以让客户端处理连接并使用
ongoworks:ddp login
进行身份验证。我发现只有极少数情况下需要通过服务器代理连接。大多数呼叫和订阅都可以通过经过身份验证的客户端直接处理。例如,我们有一个用于配置多个应用程序的管理应用程序。admin应用程序本身是一个仅限客户端的应用程序,包含多个ddp连接。由于其他应用程序的方法本身验证请求,所以我们可以省略任何服务器端传递。在这种情况下,提升的用户可以登录到任何服务器。当一个人这样做时,该服务器将与网络中的相应服务器联系,开始获取数据。如果我想将连接处理移到其他服务器的位置,则提升的服务器必须伸出手来告诉其他服务器连接到它并开始推送数据。我相信我也会有同样的问题,只是别的问题