這一期我們來說一下WebSocket負載均衡的問題
我們知道負載均衡在IT中是個很重要的概念,尤其是在網際網路行業中,很多的產品都是web形式,提供基於http請求的服務。而單個伺服器的處理能力是有限的,往往我們會用到叢集。叢集環境下,http請求是根據配置的策略來分發到指定的服務節點上的,一般在各個機器的效能都一致情況下,請求分發到每個結點的機率都一樣。
這裡 我介紹幾種不同的方法,有我自己總結的,也有看的網友的方案: 1 是通過jbosscache來實現。JBossCache是一個複製的事務處理快取,它允許你快取企業級應用資料來更好的改善效能。快取資料被自動複製,讓你輕鬆進行Jboss伺服器之間的叢集工作。所以並不是為了單純實現Load Balance而引入它,可以使用它來做多應用之間的資料共享。每個程式例項都有自己的一個count,該變數存在cache中,各個程式例項都可以讀取到其他例項的count值
2 使用三方的WebSocket服務,推薦GoEasy,不用考慮負載均衡的問題,WebSocket這一塊都不用操心,簡單穩定。
3 websocket相信經常逛cnode社群的孩紙們都知道…具體API使用方式也再熟悉不過了…使用nodejs開發的websocket服務端也是品種繁多…github上總有你喜歡的…平時耍耍當然沒問題…如果真要是承載一個生產環境服務的核心…總會有些問題需要你去解決. 不可避免的問題:
按照一個web請求佔用執行緒數為參照…我們可以把nodejs稱之為單執行緒語言…而java的servlet這種應該就是多執行緒語言了…我們可以想象在高併發情況下…單執行緒語言的執行風險還是蠻高的…畢竟如果一個請求出事那麼整個執行緒(程式)就退出了…於是乎停止服務了…為了規避風險…我們常常會使用負載均衡技術…保證整個系統的對外正常服務… 解決方案: 負載均衡方案目前來講…用apache的也不多了吧…普遍的解決方案是使用nginx配置多個upstream.實現負載均衡…例子如下:
http{
upstream http_sr {
server 192.168.0.2:8080;
複製程式碼
server 192.168.0.3:8080;
}
server {
listen 80 ;
proxy_pass http_sr;
複製程式碼
}
}
這樣對於部署在192.168.0.2和3這兩臺機器上http服務…就通過這臺nginx伺服器實現了負載均衡…但是websocket的服務端nginx的http反向代理是不能支援的.從websocket的specs我們可以很明確的其實基於tcp協議的…http協議雖然也是基於tcp…它們都使用了tcp的握手方式…但是nginx的http_proxy_pass是不能支援websocket的…
於是我們可以尋根問主…讓nginx支援tcp_proxy_pass…那websocket負載均衡的問題不就迎刃而解了…nginx有豐富的第三方擴充套件…一頓搜尋在github上找到了yaoweibin老師的nginx_tcp_proxy_module
二話不說下載此模組…重新編譯nginx(此過程略吧大家應該都懂) …修改nginx配置檔案加入下面conf:
tcp {
upstream websocket {
server 192.168.0.2:8080;
server 192.168.0.3:8080;
check interval=3000 rise=2 fall=5 timeout=1000;
}
server {
listen 80;
proxy_pass websocket;
}
複製程式碼
} 這個module的作者在description寫到: The motivation of writing these modules is Nginx’s high performance and robustness. At first, I developed this module just for general TCP proxy. And now, this module is frequently used in websocket reverse proxying.
目前基本就是用來做websocket反向代理的…測試後確實是支援的…非常感謝module的開發者另外值得注意的是你要在nginx裡同時配置tcp和http…那麼它們是不能listen同一埠的…
如果開發專案比較敢,推薦選擇2號方案,GoEasy: http://www.goeasy.io, 如果不急可以自己研究的話,可以選其他方案來深度學習一下。