簡體   English   中英

用於連接到不同 WebSocket 服務器的多個 WebSocket 客戶端的 Node.js 集群?

[英]Node.js Cluster for Multiple WebSocket Clients Connecting to Different WebSocket Servers?

我正在使用 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 集群模塊所做的完全不同。

首先,重要的是要了解接收數據對於 nodejs 來說不是 CPU 密集型過程。 實際的套接字處理和接收到計算機上的傳入數據由操作系統處理,並且在 nodejs 進程之外。

因此,如果您實際上需要多個 CPU 來處理此問題,則必須處理傳入的數據,而不僅僅是接收數據。

有幾種不同的方法可以構建它。

  1. 您可以擁有一個包含所有 webSockets 的中央進程,然后擁有多個工作進程或工作線程,您將傳入數據傳遞給它們進行處理。 這將應用許多 CPU 來處理數據,並允許在 CPU 之間分散負載處理,而不管數據到達哪個套接字。

  2. 您可以創建 4 個獨立的子進程,讓每個子進程創建四個 webSocket 連接之一,然后讓每個子進程只處理其 webSocket 的傳入數據。 這樣做的缺點是它只對每個 webSocket 應用一個進程,如果大部分數據來自一個 webSocket,那么其他進程將在很大程度上處於空閑狀態。

  3. 如果一個 webSocket 的負載比其他 webSocket 多得多,並且由於某種原因選項 #1 無法正常工作,那么您可以組合 #1 和 #2。 為每個 webSocket 創建一個單獨的進程,然后有一些工作線程來處理每個傳入的數據。 創建一個工作隊列,將傳入數據插入其中,並在每個工作線程完成其前一個數據塊時將工作發送到每個工作線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM