深入了解HyperServer


本文,我們將嘗試深入了解uniGUI HyperServer。 可以將HyperServer所有功能分成三類:

  1. HyperServer和穩定性
  2. HyperServer和可擴展性
  3. HyperServer和遠程部署

HyperServer和穩定性

HyperServer是一種新的服務器技術,專門用於從根本上提高uniGUI應用程序的可伸縮性和穩定性。那么,為什么我們需要HyperServer?

為了首先回答這個問題,讓我們先回顧一下,一個傳統的uniGUI應用程序的運行過程。一個傳統的uniGUI應用程序,是由編譯器生成二進制文件,該二進制文件通常是DLL或可執行文件。一旦將二進制文件加載到進程內存空間,該二進制文件就會充當服務器。它將無限期運行,直到由系統操作員手動卸載,或者由於程序錯誤而導致應用程序崩潰,被操作系統中止運行。在理想條件下,人們總是期望應用程序服務器二進制文件無限期地保留在內存中並提供強大而穩定的功能服務。

傳統應用程序模型的另一個特征是由單個進程負責創建,保存和提供所有會話。它類似於將所有雞蛋放在一個籃子里。在這種情況下,會話是雞蛋,應用程序服務器是籃子。這個模型有幾個缺點,最明顯的問題是,一旦Web應用程序服務器終止或重新啟動,所有活動會話都將被丟棄。另一個可能嚴重影響應用程序穩定性的問題是應用程序代碼中的bug。此類bug可能導致嚴重的內存泄漏和其他問題,最終可能導致內存損壞和Web應用程序服務器崩潰。這個問題,那怕是微小的內存泄漏問題,因累積也會影響服務器運行。由於在傳統模型中,應用服務器注定會無限期地運行,即使小問題也會隨着時間的推移變得致命。當然,對於隱藏的bug,內存泄漏,指針問題和開發人員可能看不到的其他問題的應用程序來說,這種情況是真實存在的。如果將遺留的應用程序代碼從桌面VCL應用程序移植到uniGUI,則可能難以檢測和修復某些此類問題。

毋庸置疑,根據通用設計模式開發,同時對內存問題,泄漏和bug進行了充分測試與修正,經過這種方式開發的應用程序能夠在傳統的單進程應用程序模型中無限運行,uniGUI應用服務器非常穩定和健壯是有目共睹的,眾所周知,許多開發人員開發的uniGUI應用程序的穩定性幾乎沒有問題。但是,也必須強調,盡管單一過程模型對於傳統的uniGUI應用程序可以被認為是穩定的,但是對於可伸縮性而言不能說兩者相同。考慮到穩定性,開發人員面臨的主要問題是他們可能面臨許多級別的軟件缺陷,這些缺陷可能難以檢測,修復或找到解決方法。讓我們看一下這些缺陷的列表:

  • 當前項目代碼中的錯誤。
  • 從舊項目移植的遺留代碼中的錯誤。
  • 第三方庫中的錯誤。
  • 編譯器錯誤。
  • Delphi標准庫中的錯誤(RTL,VCL,DB等)

上面的一些bug來源可能非常罕見,比如編譯器錯誤和Delphi庫錯誤,我們不能否認它們的存在。在上述bug中,最常見的錯誤是直接存在於項目代碼中的錯誤,但只有可能導致內存泄漏,內存損壞或代碼死鎖的錯誤對服務器應用程序最有害。Delphi應用程序的本地特性使它們容易受到內存問題的影響,並且在所有這些問題都解決之前,不能實現完全穩定的應用程序。軟件開發團隊(尤其是大型團隊)面臨的最大問題是,他們無法始終確保生成相同質量的代碼,並且每個新版本都沒有缺陷。即使是長時間的壓力測試也可能不足以檢測,隔離和修復以及隱藏的代碼缺陷。

為了解決上述問題,我們需要一個新的服務器模型,它可以更好地容忍帶有錯誤的應用程序代碼。這里的主要技巧是增加代碼在生產環境中的生存機會,即使它還沒有為黃金時段做好准備。 HyperServer旨在提高存在此類條件時的穩定性。 HyperServer通過實現不同的機制來實現這一目標:內部負載平衡和節點回收。負載平衡將在節點之間分配整體服務器負載。節點回收將通過基於預定義規則回收節點,從而減少他們的生命周期。回收將確保節點僅在一段時間內駐留在進程內存空間中。與將應用程序服務器進程無限期地保存在內存中的經典模型不同。

必須要說的是,在這個意義上,HyperServer不應被視為有缺陷代碼的解決方案,也不應被視為處理內存問題的工具。 HyperServer既不會修復您的應用程序錯誤,也不會為它們提供解決方法。

HyperServer和可擴展性

Web應用程序最大的問題之一是它們能夠擴展,uniGUI應用程序也是如此。事實上,可擴展性可能是uniGUI應用程序的一個更大的問題,因為uniGUI會話是有狀態的並且將所有狀態信息保存在進程內存中。我們可以說使用單個進程來服務所有會話的經典應用程序模型可以擴展到幾百個會話。這並不意味着您不能在經典模型中擁有數千個會話。從理論上講,只要您的服務器具有足夠的資源且您的應用程序設計具有固有的可擴展性,經典模型中的會話數量就沒有上限。這里的問題是,在一個籃子里放1000個雞蛋是否安全?顯然,答案是否定的。然而,如果我們在10個籃子中分配1,000個雞蛋,每個雞蛋包含100個雞蛋,那么每個人似乎都同意。這就是HyperServer誕生的出處。 HyperServer在內部將您的應用程序划分為多個節點,並在這些節點之間分配會話。由於每個節點都是一個單獨的進程,因此其會話與其他節點中的會話隔離。因此,Node中的任何問題都只能影響該節點及其會話。


雞蛋和籃子問題不是與傳統單進程應用程序服務器模型相關的唯一問題。另一個問題是在同一進程中保留大量會話可能會導致其他問題。一個問題是uniGUI應用程序是高度多線程的應用程序,當然它需要使用鎖來同步某些操作。隨着會話數量的增加,這種鎖可能會變成瓶頸。雖然在uniGUI中我們嘗試盡可能少地使用鎖,但它們是不可避免的。在RTL代碼和其他涉及的第三方庫中也可能出現代碼鎖。


HyperServer不僅可以管理同一服務器內的節點集群,還可以擴展為管理多個服務器上的多個節點集群。這意味着您將能夠在服務器場上運行uniGUI應用程序。這將為使用uniGUI和Delphi開發的Web應用程序添加新的維度。 

HyperServer和遠程部署

HyperServer為uniGUI框架添加的另一個令人興奮的新功能是能夠遠程部署應用程序的新版本,而無需停止服務器。因此HyperServer不僅僅具有穩定性和可擴展性,它還涉及到應用程序服務器運行的連續性和可用性。在傳統的單一過程中,uniGUI應用程序更新應用程序相對困難。首先,需要跟蹤出流量較低且活動會話很少的時間點,然后,需要關閉服務器,這意味着將丟棄所有活動會話,這時候,你可能需要通知用戶,從應用中注銷並等待更新完成。

針對以上常見的場景,使用HyperServer可以遠程上傳新版本的應用程序,其余工作將由HyperServer完成。 HyperServer將逐步更新節點,所有新會話將重定向到運行新版本應用程序的節點,舊版本的節點將在其所有會話都注銷后被丟棄並清除。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM