2016-03-04 146 views
0

我一直在使用Google,我對此有點困惑。幾乎所有我讀過的關於它的東西都有1個用例,但它對我來說似乎並不是最好的。也許它是?不確定。可伸縮Websockets - 我很困惑

讓我先設置環境: 的前端被AngularJS 通過Laravel供電(我們會打電話給他們一個& B)的兩個後端的API供電。

現在,所有這3個規模都是相互獨立的。每個人都在自己的碼頭集裝箱。每個處理路由和任何事情的前面都有負載平衡器。我正在爲我的數據庫使用RDS。

現在,我通常看到的方式是使用負載均衡器的hash-ip函數,以便您只需連接到處理所需web服務器事件的服務器即可。

那麼,這並不像我想要的那樣。真的,長輪詢似乎是我想要的,但我想也許我可以讓websocket工作。基本上,任何時候任何人在任何一個API上改變任何東西,都會觸發一個事件。然後我需要所有的前端進行更新。現在據我所知,websockets使用redis來跟蹤事件。

如果它確實使用redis,那麼如何在多臺服務器上縮放redis?或者,如果使用elasticache之類的東西更容易,那麼我就不必處理那部分?

這一切基本上是真的嗎?我的思路是否正確?

感謝您的關注。對不起,如果它有點流言蜚語或困惑。我仍然不清楚,所以我寫的所有內容都只是我的想法。

+1

的WebSockets自己什麼都沒有做的Redis。有一個socket.io(使用webSockets)的多服務器實現,它使用redis來存儲狀態。在那個實現中,有一箇中央redis存儲庫,擴展中涉及的所有服務器都可以諮詢,以便與可能連接到不同服務器的用戶進行通信。你可以閱讀關於redis/socket.io的組合[這裏](http://socket.io/docs/using-multiple-nodes/)。 – jfriend00

+0

我想通了。只有幾個額外的步驟,我沒有看到。 – Kenyon

回答

0

我想通了。我會爲任何碰巧遇到此問題的人發佈答案。

所有這些都可以像我需要的那樣獨立縮放。但它有點令人困惑,而且我在使用Docker,所以我的答案也會涉及到這一點。

在Laravel上,我只是設置了Events。他們被髮送到Redis實驗室的Redis服務器。

在我的前端docker上,有一個AngularJS應用程序,並且websocket.js服務器通過端口3000上的節點運行。容器上有Nginx服務它們,AngularJS協議只是一個普通的服務器指令。節點的一個,是一個代理pass目錄,所以端口80工作正常,但它被轉發到後端的端口3000。

websocket.js服務器端部分連接到Redis Labs上的同一Redis服務器。

AngularJS應用程序是使用websockets客戶端代碼的應用程序。

現在有另一個docker容器運行負載平衡的nginx服務。所以,負載均衡器是所有websocket,api和前端URL經歷的負載均衡器。

將websocket.js放入它自己的容器並單獨調整它可能會更好。但是,現在,我認爲將前端和websocket.js擴展到一起將工作得很好。

這是我如何做的概述。我也用了很多的東西從這裏:

https://laracasts.com/discuss/channels/general-discussion/step-by-step-guide-to-installing-socketio-and-broadcasting-events-with-laravel-51

https://www.nginx.com/blog/nginx-nodejs-websockets-socketio/