建立可擴展 Java Web 應用程式的最佳實踐

建立可擴展 Java Web 應用程式的最佳實踐

我們得到了這個 JavaEE WebApp(JSP+Struts+Hibernate+MySQL),它目前在單一伺服器上運行。由於網站的成長和效能問題,我們決定將專案叢集到一些機器上。該網站應該能夠容忍每秒 5000 個請求。經過一些谷歌搜尋和閱讀內容後,我想出了一些策略來完成這項工作:

  • 使用 Apache 作為前端負載平衡器和反向代理,一些 Tomcat 實例各自位於單獨的電腦上,最後是運行 MySQL 的資料庫伺服器。 Tomcat 實例可以根據需要進行擴充。
  • 使用nginx作為前端負載平衡器和反向代理。其餘的就跟上面一樣了。
  • 使用HA代理作為前端負載平衡器和反向代理。其餘的就跟上面一樣了。

我想在上述方法中,所有流量都應該通過前端負載平衡器(Apache、Nginx 或 HAProxy 伺服器)。這使得前端伺服器成為瓶頸,同時也是單點故障(SPOF)。是對的嗎?單一前端伺服器能否承受大型 Web 應用程式的所有流量?

為了解決這個問題,我想出了一個手工策略:

  • 將登入頁面和驗證操作放在前端伺服器上(例如,可以從 myapp.com 存取它)。當使用者成功登入時,他會被重新導向到後端伺服器之一(例如 srv1.myapp.com)並在那裡繼續其活動。

那麼,我走的路正確嗎?

讓我知道您對這些方法的看法,如果您正在考慮更好的方法,請在此處提及。

答案1

將登入頁面放在前端伺服器上並重新導向到後端是一個壞主意。使用者可能會為您的後端伺服器添加書籤,最終可能會出現分佈不均的情況,並且當伺服器發生故障時,如果使用者位於同一會話中,他們仍然會嘗試存取它。

您需要的是主動/被動(心跳/起搏器/IP故障轉移/DNS 故障轉移) 或主動/主動 (DNS 輪詢/網路負載平衡)前端伺服器。

透過主動/被動,您的所有流量將被重新導向到一台前端伺服器,並有第二台備用伺服器(雙機熱備)。當第一個伺服器發生故障時,您會以某種方式進行故障轉移(透過重新分配 IP 位址或修改 DNS*)以指向第二個伺服器。

透過主動/主動,您將有兩個(或更多)伺服器持續處於活動狀態,使用以太坊DNS 輪詢或者IP/網路負載平衡在兩者之間(大致)均勻分配負載。然後,兩台伺服器將再次將負載分配給您的後端伺服器。

active/active 是大多數大型 Web 應用程式使用的方法(請參閱 Youtube/Google/Twitter/Wordpress.com/Tumblr 的 DNS 記錄,它們將為伺服器提供多個 IP 以進行 DNS 循環。

一旦您做出決定並實施它,您所要做的就是在解決方案之間進行選擇。我個人建議NGINX但每個人都有自己的偏好(HA代理,烏賊,切羅基,光速,F5(硬體),思科(硬體)和無數其他)。

不幸的是,對於這類問題,我們不能只說“這樣做”,因為這實際上取決於您的要求。研究上面的一些關鍵字,如果您有任何具體問題,請隨時提問。

*如果可能的話,應該避免基於 DNS 的故障轉移,有些用戶端會快取超出其 TTL 的 DNS,因此不太理想。

答案2

我不了解 nginx,但您可以在主動/被動配置中配對幾個 haproxy 負載平衡器,以防止 haproxy 成為單點故障。

也有商業解決方案,但由於某種原因,它們似乎沒有在伺服器故障上得到那麼多的“墨水”。

相關內容