Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 多个WebSocket客户端连接到不同WebSocket服务器的Node.js群集?_Javascript_Node.js_Websocket_Load Balancing_Node Cluster - Fatal编程技术网

Javascript 多个WebSocket客户端连接到不同WebSocket服务器的Node.js群集?

Javascript 多个WebSocket客户端连接到不同WebSocket服务器的Node.js群集?,javascript,node.js,websocket,load-balancing,node-cluster,Javascript,Node.js,Websocket,Load Balancing,Node Cluster,我正在使用Node.js实现一个Websocket客户端,该客户端订阅来自多个Websocket服务器的数据源 foo = new WebSocket('ws://foo.host ...') bar = new WebSocket('ws://barhost ...') baz = new WebSocket('ws://baz.host ...') qux = new WebSocket('ws://qux.host ...') foo.on('data', data => doSo

我正在使用Node.js实现一个Websocket客户端,该客户端订阅来自多个Websocket服务器的数据源

foo = new WebSocket('ws://foo.host ...')
bar = new WebSocket('ws://barhost ...')
baz = new WebSocket('ws://baz.host ...')
qux = new WebSocket('ws://qux.host ...')

foo.on('data', data => doSomething(data))  // 5 events per second 
bar.on('data', data => doSomething(data))  // 1 events per second 
baz.on('data', data => doSomething(data))  // 1 events per second 
qux.on('data', data => doSomething(data))  // 1 events per second 
问题:如果我们有一个多核系统(例如4个核),是否可以使用Node.js Cluster对传入Websocket数据的处理进行负载平衡,以便每个核每秒大约接收2个要处理的事件


或者最好手动启动8个node.js实例并向其传递一个参数[foo | bar | baz | qux]以选择它将连接到的Websocket服务器?

nodejs群集模块解决了一个特定问题。当您有一个http服务器并且希望在多个进程之间平衡传入连接时,nodejs集群模块就是这样做的。那不是你所拥有的。您有多个客户端传出webSocket连接,并且显然希望应用多个进程来处理传入数据。这与nodejs集群模块的功能完全不同

首先,重要的是要理解接收数据对于NodeJ来说不是CPU密集型的过程。实际的套接字处理和接收传入的数据到计算机上是由操作系统处理的,并且在nodejs进程之外

因此,如果您实际上需要多个CPU来处理这个问题,那么必须处理传入的数据,而不仅仅是接收数据

有几种不同的方法可以构建它

  • 您可以有一个包含所有WebSocket的中心进程,然后有和数量的工作进程或工作线程,您可以将传入数据传递给这些进程或工作线程进行处理。这将应用许多CPU来处理数据,并允许在CPU之间分配加载过程,而不管数据到达哪个套接字

  • 您可以创建4个独立的子进程,让每个子进程创建四个webSocket连接中的一个,然后让每个子进程只处理其webSocket的传入数据。这样做的缺点是,它只对每个webSocket应用一个进程,如果大多数数据来自一个webSocket,那么其他进程将大部分处于空闲状态

  • 如果一个webSocket的负载比其他webSocket大得多,并且出于某种原因,选项#1不能很好地工作,那么您可以将#1和#2结合起来。为每个webSocket创建一个单独的进程,然后使用一些工作线程来处理每个webSocket的传入数据。创建一个工作队列,将传入数据插入其中,并在每个工作线程完成其上一个数据块时将工作发送给它