我使用socket.IO使集群worker成为Socket.IO服务器。每个worker(ws)都有一个标识符,它和客户端都知道。worker通过.of('namespace')作为标识符来限制连接。
我希望master根据worker的标识符将流量委派给worker,例如:当客户端使用路由/服务器/abc123连接时,具有标识符abc123的工作器具有委托给它的连接。
有什么方法可以实现这一点吗?我尝试使用Node.JS集群为.fork并保持在同一个端口上。欢迎遵循这些要求的其他解决方案(沿着支持socket.io服务器)。
--U需要指定初始连接。之前的错误是由于命名空间不稳定。
1条答案
按热度按时间x759pob21#
一个想法是不使用集群模块,而是运行多个单独的子服务器(在不同的端口上),这些子服务器是专门为传入的socket.io连接而设计的。不使用集群模块是因为您不希望或不需要内置到集群模块中的负载平衡,因为您有自己的主机分配机制。
然后,当客户端想要建立socket.io连接时,它会通过http请求询问主服务器它应该连接到哪个主机/端口,服务器会返回该客户端标识符的主机名或IP地址和特定服务器的端口。然后客户端直接建立到该主机/端口的socket.io连接。
如果您需要将一个活动客户端移动到另一个主机/端口,您可以向它发送一个socket.io消息,告诉它新的主机/端口应该是什么,然后客户端将断开连接并重新连接到新的主机/端口。
当然,任何未连接的客户端都可以通过更改服务器端Map表移动到新的主机/端口(例如,如果您socket.io出于扩展或维护原因添加或删除www.example.com主机)。因此,当它下次连接时,它将经历相同的连接过程(询问主服务器使用哪个socket.io主机/端口)。
仅供参考,这种类型的连接方案被一个主要的即时消息系统使用。它允许比集群模块更大的规模,因为附加的socket.io服务器进程可以在附加的服务器上(甚至在不同的数据中心或国家/地区),并且不限于同一主机上的不同进程。
啊,原始URL. /server/abc123。客户端确实知道
如果原始URL已指定(在URL中)目标服务器进程应该是什么,那么你可以使用像nginx这样的东西来为你做负载平衡,而不是让客户端直接连接到不同的主机/端口,尽管因为你的客户端已经有了指定它想要的主机的智能,也许它仍然更容易只是改变客户端连接到一个不同的主机/端口,然后你就不需要nginx为你做路由。