在 nodejs 分叉进程之间共享数千个开放的 websocket
Sharing thousands of open websockets between nodejs forked processes
我正在从事一个项目,该项目将包含一个移动应用程序、一个桌面应用程序和一个服务器。服务器将需要始终保持与桌面应用程序的开放套接字(dropbox 是如何做到的!?)。打开移动应用程序时,将在移动应用程序和服务器之间打开一个套接字,桌面应用程序将向移动应用程序发送事件(可能带宽相当低),反之亦然。
服务器的最大障碍是在相当普通的服务器上同时保持如此多的套接字打开。大多数时候,套接字将处于空闲状态,因为人们不会使用该应用程序。我只有一个人,我不想在服务器成本上支付一大笔钱,所以我想我会选择 nodejs,它能够以低内存使用率打开大量的 websockets(通常我会使用 Java,但我想内存很快就会成为问题)。
我无法解决的问题是处理 nodejs 和集群 api。 由于集群 api 产生了一个单独的 nodejs 进程,我将如何在分叉进程之间共享 websocket 连接?如果我做不到,我必须以某种方式保证移动 websocket 在打开桌面客户端 websocket 的同一节点进程上打开。也不确定我能不能做到。
我有哪些选择?
Socket.io 有一些关于如何跨集群使用它的文档,你需要将 "references" 存储到所有集群都可用的存储中的可用套接字,然后使用那些存储的确定每个连接用户的 IP 等的参考资料
http://socket.io/docs/using-multiple-nodes/
如果这看起来有点复杂,可以使用模块为套接字引用创建 "store" 并使它们在所有集群实例中可用
http://socketcluster.io/#!/
https://github.com/elad/node-cluster-socket.io
还有其他几个可用的模块,可以轻松地跨集群使用套接字,只需确保它们使用某种 "sticky session" 的实现,而不仅仅是基本的 Redis 存储,因为显然有一些缩放问题。
我正在从事一个项目,该项目将包含一个移动应用程序、一个桌面应用程序和一个服务器。服务器将需要始终保持与桌面应用程序的开放套接字(dropbox 是如何做到的!?)。打开移动应用程序时,将在移动应用程序和服务器之间打开一个套接字,桌面应用程序将向移动应用程序发送事件(可能带宽相当低),反之亦然。
服务器的最大障碍是在相当普通的服务器上同时保持如此多的套接字打开。大多数时候,套接字将处于空闲状态,因为人们不会使用该应用程序。我只有一个人,我不想在服务器成本上支付一大笔钱,所以我想我会选择 nodejs,它能够以低内存使用率打开大量的 websockets(通常我会使用 Java,但我想内存很快就会成为问题)。
我无法解决的问题是处理 nodejs 和集群 api。 由于集群 api 产生了一个单独的 nodejs 进程,我将如何在分叉进程之间共享 websocket 连接?如果我做不到,我必须以某种方式保证移动 websocket 在打开桌面客户端 websocket 的同一节点进程上打开。也不确定我能不能做到。
我有哪些选择?
Socket.io 有一些关于如何跨集群使用它的文档,你需要将 "references" 存储到所有集群都可用的存储中的可用套接字,然后使用那些存储的确定每个连接用户的 IP 等的参考资料
http://socket.io/docs/using-multiple-nodes/
如果这看起来有点复杂,可以使用模块为套接字引用创建 "store" 并使它们在所有集群实例中可用
http://socketcluster.io/#!/
https://github.com/elad/node-cluster-socket.io
还有其他几个可用的模块,可以轻松地跨集群使用套接字,只需确保它们使用某种 "sticky session" 的实现,而不仅仅是基本的 Redis 存储,因为显然有一些缩放问题。