多个WebSocket客户端连接到不同的WebSocket服务器,使用Node.js集群技术如何实现?

3

我正在使用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服务器?

1个回答

3
Node.js 集群模块解决了一个特定的问题。当您有一个 HTTP 服务器并且希望在多个进程之间平衡传入连接时,Node.js 集群模块就派上用场了。但这不是你需要的。您有多个客户端的出站 WebSocket 连接,显然希望将多个进程应用于处理传入的数据。这与 Node.js 集群模块完全不同。
首先,重要的是要理解对于 Node.js 来说,接收数据不是一个 CPU 密集型的过程。实际的套接字处理和接收传入数据到计算机上是由操作系统处理的,而不是在 Node.js 进程内部进行。
因此,如果您实际上需要多个 CPU 来处理此任务,那么必须是为了处理传入的数据,而不仅仅是接收它。
有几种不同的方式可以构建它:
  1. 您可以有一个中央进程,其中包含所有 WebSocket,并拥有一些工作进程或工作线程,您将传入的数据传递给这些进程进行处理。这将应用许多 CPU 来处理数据,并允许负载处理在各个 CPU 之间分配,而不管数据到达哪个套接字。
  2. 您可以创建 4 个独立的子进程,并使每个子进程创建其中一个四个 WebSocket 连接,然后使每个子进程仅处理其 WebSocket 的传入数据。这种方式的缺点是只为每个 WebSocket 应用了一个进程,如果大多数数据都在一个 WebSocket 上,那么其他进程将基本处于空闲状态。
  3. 如果一个 WebSocket 的负载要比其他 WebSocket 多得多,并且出于某种原因选项#1 不起作用,则可以结合选项#1 和#2。为每个 WebSocket 创建一个单独的进程,然后为每个进程设置一些用于处理其传入数据的工作线程。创建一个工作队列,将传入的数据插入其中,工作完成后可以将工作发送到每个工作线程。

@Udhaya - 由于您的评论似乎与此问题及我的具体答案没有直接关联,请编写自己的问题并在那里显示详细上下文。 - jfriend00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接