簡體   English   中英

使用粘性會話和websockets進行擴展

[英]Scaling with sticky sessions and websockets

最初,我們有兩個AWS EC2實例,其中node.js在帶有粘性會話的負載均衡器后面運行。 隨着負載的增加,會添加更多實例。

但我們面臨着這種方法的問題。 由於應用程序主要用於研討會,負載通常會在很短的時間內(研討會開始)增加,並且每個研討會參與者都與前兩個實例進行粘性會話,而新的實例幾乎沒有。 因此,性能保持不佳。

首先想到的是:讓我們禁用粘性會話。 但是這會破壞我們的websockets,因為它們需要粘性會話(至少這是我讀過的)。 另一個問題是負載減少。 實例關閉,套接字連接也會丟失。

是否有一種方法可以在實例之間轉換用戶會話,或者讓websockets在沒有粘性會話的情況下工作(可能使用Redis)?

解決方案是Application Load Balancer (請參閱注釋 )。

  1. 起初我們不得不禁用輪詢,因為這對其余部分不起作用。 這是通過手動定義傳輸來完成的。

     let ioSocket = io('', { path: '/socket.io-client' transports: ['websocket'] 
  2. 之后,我們設置了一個帶有兩個目標組的標准應用程序負載均衡器:一個用於websockets,另一個用於所有其他請求。 websocket目標組的規則通過正則表達式匹配特定路徑:

路徑模式

  1. 最后一個問題是擴展:如果其中一個實例由於集群上的負載較低而關閉,則連接可能會丟失。 在客戶端斷開連接后,通過簡單的重新連接修復了這個問題(在我們的例子中是一個角度應用程序):

     [...] this.socket.on('disconnect', () => { // Reconnect after connection loss this.connect(); }); [...] 

暫無
暫無

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

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