我正在使用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集群来负载平衡传入Websocket数据的处理,例如每个内核大约每秒接收2个事件进行处理?
还是手动启动8个node.js实例并为其传递参数 [foo | bar | baz | qux] 来选择将连接的Websocket服务器更好?
答案 0 :(得分:2)
nodejs集群模块解决了一个特定的问题。当您拥有一台http服务器并且想要在多个进程之间负载平衡传入连接时,这就是nodejs集群模块的工作。那不是你所拥有的。您有多个客户端出站webSocket连接,并且您显然想应用多个进程来处理传入数据。这与nodejs集群模块的功能完全不同。
首先,重要的是要了解,接收数据对于nodejs来说不是CPU密集型过程。实际的套接字处理和将传入数据接收到计算机上的操作由操作系统处理,并且不在nodejs进程之外。
因此,如果您实际上需要一个以上的CPU来工作,则必须处理输入的数据,而不仅仅是接收数据。
有几种不同的结构方式。
您可以有一个包含所有webSocket的中央进程,然后具有将传入数据传递到其中进行处理的辅助进程或辅助线程的数量。这样可以将许多CPU应用于数据处理,并且无论数据到达哪个套接字,都可以使负载处理过程在CPU中分散。
您可以创建4个单独的子进程,并让每个子进程创建四个webSocket连接之一,然后让每个子进程仅处理其webSocket的传入数据。这样做的缺点是,它仅将一个进程应用于每个webSocket,并且如果大多数数据都位于一个webSocket上,则其他进程将大部分处于空闲状态。
如果一个webSocket的负载比其他webSocket大得多,并且由于某种原因选项#1不能很好地工作,则可以将#1和#2组合在一起。为每个webSocket创建一个单独的进程,然后具有一些工作线程来处理每个webSocket的传入数据。创建一个工作队列,将传入的数据插入其中,并在工作线程完成之前的数据块时将工作发送到每个工作线程。