簡體   English   中英

擴展執行繁重計算的 node.js websocket 服務器

[英]Scaling a node.js websocket server that does heavy computations

我有一個 node.js 服務器和一個接收大量消息的 websocket 連接。 該服務器還執行繁重的 cpu 工作。 我看到 ws 連接不斷丟棄/重新連接/丟棄/等。 我的猜測是cpu工作阻塞了主線程這么多,同時ws收到這么多消息,ws連接就失敗了?

我最初的解決方案是將所有 cpu 工作轉移到一個節點 worker_thread,這有點幫助,但我仍然看到 ws 失去了很多連接。 我的想法是,node 應該在網絡 IO 上非常高效,所以如果我將所有 cpu 工作轉移到另一個線程中,網絡工作就不會被 cpu 工作阻塞。

服務器是有狀態的,這個服務器只能有 1 個,所以我不能再啟動更多。

我不確定如何進行。 一些想法是:

  1. 將 cpu 工作轉移到另一個進程中,並通過某種進程間通信方法進行通信。 但這比 worker_thread 更好嗎?
  2. 水平擴展 websocket,所以如果一個失敗,其他的就會彌補。 以這種方式擴展 websocket 似乎相當復雜。

第一 -

//服務器是有狀態的,這台服務器只能有1台,不能隨便多轉。

你應該去掉這個瓶頸。 只要你有這個,你就不會 go 擴展的想法是在應用程序的副本之間分配網絡和 cpu 工作負載。

如果您的服務器是有狀態的,請創建一個 state controller 服務器來處理所有 state 信息。 啟動應用程序的副本並在副本和 state controller 服務器之間建立集群內通信。

完成此設置后,創建一個負載均衡器,它可以單獨檢查副本的就緒情況並將流量轉發到可用副本。 不要忘記,在 Node JS 中,網絡處理發生在 kernel 級別。 因此,該操作系統機制將在第一線處理負載並保持請求等待,直到工作負載准備好處理它們。 此設置允許您控制閾值,例如副本數量和就緒超時 - 這可以為性能微調掃清障礙。 這些調整取決於您的請求數據、響應數據、處理時間等事實。

好消息是幾乎所有的容器編排系統都提供了以上所有功能。 大多數情況下,您必須自己處理處理狀態的服務器。

https://kubernetes.io/docs/concepts/cluster-administration/networking/ https://kubernetes.io/docs/concepts/workloads/controllers/deployment/ https://kubernetes.io/docs/tasks/configure- pod-container/configure-liveness-readiness-startup-probes/

暫無
暫無

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

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