1
我有一臺Node.js應用程序部署在多臺服務器上,Nginx服務器負載平衡到這些服務器的瀏覽器流量。服務器使用推送通知機制(使用websocket模塊)與瀏覽器進行通信。在分佈式Node.js應用程序中使用websockets推送通知
在當前設置中,瀏覽器加載一個應用程序頁面,在該頁面上打開連接到服務器的客戶端套接字。 websocket請求被髮送到Nginx,Nginx將其發送到集羣中的一臺服務器。當服務器發生事件時,它會通知監聽服務器websocket的客戶端瀏覽器。
問題是每臺服務器只與websocket客戶端的一個子集通信。另外,每個服務器只知道發生在服務器上的事件。結果,並非所有的客戶端都會收到所有服務器事件的通知。
我可以看到幾個可能的解決方案:
- Nginx的配置從每個瀏覽器發送的WebSocket請求到所有的服務器的羣集。我無法弄清楚如何去做。負載平衡不支持廣播。
- 將websocket連接存儲在數據庫中,以便所有服務器都可以訪問它。我不知道如何序列化websocket連接對象以將其存儲在MongoDB中。
- 在集羣中的服務器(某種消息總線)之間建立通信機制,並且每當事件發生時,讓所有服務器通知他們正在跟蹤的websocket客戶端。這使系統稍微複雜化,並要求節點知道彼此的地址。哪種軟件包最適合這種解決方案?
在Node.js應用程序中實現分佈式推送通知最簡單的方法是什麼?
謝謝您的答覆。 本文討論如何將粘性會話作爲負載平衡策略實施。我已經在做。我需要的是能夠在Nginx中進行組播(向上遊組中的所有服務器發送請求)。文章提到了在socket.io之上實現的廣播機制,但這需要Redis服務器。將其添加到系統體系結構中並不保證手頭的問題。 –
@MichaelSmolyak如果你不想介紹Redis,恐怕你不得不自己做類似的事情。在上面的選項#1中,您將如何防止重複操作(因爲每個服務器都會收到每個事件)?所以我擔心你不能那樣做。 Redis解決方案更接近您的#2和#3點。要向所有連接的客戶端發佈消息,您不需要序列化WebSocket,而只需通知所有服務器將該消息發佈到其客戶端組。 Redis是一個pub/sub機制(與您在第3點中提到的相同)來實現這一點。 – Murukesh
只是爲了澄清點#3。如果你使用一個pub sub解決方案,你不需要知道彼此的地址,只有一個地址(pub sub server的地址)應該被所有的服務器所知道。 – Murukesh