序列化,存储和反序列化WS对象

时间:2017-05-23 04:14:42

标签: javascript node.js websocket

我正在使用NodeJS ws库来构建应用程序。目前,我使用一个对象来存储用户的websocket连接的实例,并使用唯一的用户ID作为密钥。 伪代码:

let userWebSockets = { 'user-guid-here': WSConnection
};

这很好用,当我需要定位特定用户发回消息时,我可以从userWebSockets对象获取他们的连接let ws = userWebSockets['user-guid-here']

问题是,如果我在运行的框上集群节点进程,使用集群模块分叉主进程,或者对框进行聚类,则无法保证相同的userWebSockets对象将在内存,当我尝试根据用户的唯一标识符查找用户的连接时,我冒险将undefined作为查找的返回值。

我的第一个倾向是使用一些远程k => v像Redis这样存储来处理维护字典,但是我在实现尝试中意识到Redis显然不会存储Javascript对象,而我能用这种技术做的最好的事情就是以稍后的方式序列化对象重组/反序列化。我尝试使用来自以下存储库的Crockford的cycle.js:https://github.com/douglascrockford/JSON-js/blob/master/cycle.js这是不成功的,因为我发现我试图恢复生命的对象的原型方法没有被保留(在这种情况下ws.send(),例如)。

我目前的解决方法是使用nginx平衡到上游实例池,并使用ip_hash指令使用户ip =>实例粘性,但我对此解决方案不满意。

有没有人对我在这里要做的事情有任何好运?如果有更好或更惯用的方式来处理用户,我也可以重新设计应用程序=> ws连接关联。

0 个答案:

没有答案