2016-05-01 98 views
1

我想使用socket.io,但我將運行我的應用的多個實例,所以這就是事情變得有趣的地方。Socket.io和Redis pub/sub

  • 我需要在不同的端口上運行多個實例。這裏沒問題。

  • 我決定不使用Node自己的集羣,我將使用Nginx進行負載平衡(這就是爲什麼我創建應用程序的多個實例)。 Nginx支持websockets,所以這一個也被整理出來。

  • 考慮到將會有多個實例,並非所有實例都不能直接相互通信(用戶A連接到實例X,如果用戶B連接到實例Y,那麼它們將無法與服務器通信是互相獨立的),所以我需要使用Redis的pub/sub機制作爲包裝來模仿socketio的發射功能。這樣,即使我有多個應用程序實例或在不同的服務器上運行它,只要連接到同一個Redis服務器,每個人都可以相互通話。爲了達到這個目標,我需要使用socket.io-redis和socket.io-emitter模塊。

我說得沒錯,這種方法有什麼問題嗎?

回答

1

關於正確的聲音可能除了你確定你需要在不同的端口上有多個Node應用程序實例?因爲你可能能夠處理比使用一臺服務器更多的負載,並且有辦法通過socket.io分離出不同的通信通道。

+0

我想利用所有的CPU,似乎有兩種方式來實現它,使用集羣模塊(本地解決方案)或創建多個實例(等於核心數),使用Redis的pub/sub進行套接字通信因爲如果它們不在同一臺服務器上,它們不能直接對話),並讓Nginx處理這些實例之間的負載平衡。它也應該適用於運行多個實例的多個服務器。那是對的嗎? – salep

+1

我認爲你所說的會起作用,只是認爲你可能想仔細檢查一下,你是否真的受到CPU的限制。當然,如果只用一個進程就會遇到CPU/IO問題,那麼擁有可擴展的解決方案當然很好,但這並不能保證你會遇到瓶頸。 –

+0

我很可能不會很快遇到這個瓶頸(可能永遠不會),但我希望有一個可擴展的解決方案,可以利用盡可能多的資源。謝謝! – salep