uniGUI HyperServer


uniGUI HyperServer 是一種新的服務器體系架構, 旨在高度提高 uniGUI 應用程序的可用性、穩定性和特定的可伸縮性。 這一目標是通過應用業界已知和廣泛使用的技術 (如負載平衡和過程回收) 實現的。


傳統的 uniGUI 應用程序服務器由一個單獨的進程和多個線程組成。 單個進程可以是 uniGUI 可執行文件或 ISAPI 或 Apache 工作進程。 在所有情況下, 所有會話都駐留在單個進程中, 並且在同一進程中有多個線程用於處理傳入的請求。


uniGUI HyperServer 改變了模型, 變成了一個多進程多線程模型。 在這個新模型中, 會產生幾個工作進程來服務同一 web 應用程序。 會話將在工作進程之間划分, 並且基於配置, 您可能有多個工作進程用於相同的 uniGUI 應用程序。 工作進程由另一個實際上叫 HyperServer 進程來管理和調度。 HyperServer 將是所有客戶端請求的入口點。 HyperServer 將接受所有請求並將它們分發到工作進程中。 HyperServer 還有責任在需要時生成新的工作進程, 並在不再需要時回收它們。 由於 uniGUI 會話是有狀態的, 因此 HyperServer 的另一個重要職責是將傳入的會話請求定向到創建該特定會話的正確的工作進程。 在 HyperServer術語中, 每個工作進程稱為一個節點。

 在繼續之前,我們先來學習一下HyperServer引入的幾個新術語。

HyperServer

HyperServer是所有請求的主要入口點。它將過濾請求並將它們引導到相應的節點。如果請求未與節點關聯,則HyperServer將根據負載分配算法將其定向到任意節點。 HyperServer還負責創建新節點並在需要時回收它們。

毋庸置疑,HyperServer本身是一個uniGUI應用程序,專為此特定目的而設計。 HyperServer以預編譯的二進制文件(Exe和Dll)的形式部署。可用的部署選項包括:獨立服務器,ISAPI模塊和Windows服務。將來HyperServer組件將包含在uniGUI庫中,因此開發人員將能夠創建自己的自定義HyperServers。

Node(節點)

HyperServer節點實際上是一個工作進程。同時,uniGUI應用程序本身也以獨立的EXE模式部署。開發人員將以Node的形式部署他們的應用程序。開發人員在設計Node應用程序時不需要采取任何特殊設計,跟開發任何標准的uniGUI應用程序是一樣的。

Node Id(節點ID)

每個節點都有一個唯一的節點ID。在創建節點時分配節點ID。當節點被回收時,將重新使用節點ID。

Transport(傳輸通道)

HyperServer使用傳輸通道在內部與節點通信。目前僅實現HTTP傳輸通道。未來,將基於各種技術實現其他的Transport,如Wiidows Pipes,TCP和UDP。

Node Recycling(節點回收)

節點將根據預定的設計方案進行回收,當需要回收節點時,將請求關聯的進程做終止操作並在確認此請求后,Node將開始終止其所有會話並最終終止其進程。如果節點未確認回收請求,則HyperServer將強制終止該請求。

Active Node(激活節點)

活動節點是那些主動服務會話的節點,他們能夠接受新的會話。

Suspended Node(掛起結點)

掛起的節點是無法與HyperServer通信的節點。在正常操作下,HyperServer會以特定間隔輪詢其所有節點。如果其中一個節點未能響應,則將其標記為已暫停。如果節點在一定量的重試后未能響應,則它將被視為失敗的節點並將被清除。

Purged Node(清除節點)

清除節點是從活動節點列表中刪除並發送到回收隊列的節點。清除節點既不接受新會話也不處理任何傳入請求。下次清理回收隊列時,它將從進程空間中刪除。

Discarded Node(丟棄節點)

丟棄節點是實際擁有多個會話的節點,但它不接受新會話。它將繼續存在,直到所有會話終止。在沒有剩余會話時,它將被清除。

Persistent Node Zero(零持久節點)

零持久節點是一個Id = 0的節點,它保證持續運行,雖然偶爾也會像其他節點一樣被回收,但在回收后會立即重新加載,不會被永久卸載。持久節點的主要目的是確保一次至少運行一個節點。考慮一種情況,一個uniGUI應用程序需要在線程中執行后台任務,這個任務可能利用放置在ServerModule上的TUniThreadTimer中執行。在傳統的uniGUI應用程序中,只有一個進程,因此后台任務可以保證以Singleton的形式運行。但是,在同時運行同一進程的多個副本的HyperServer中,應該有一種機制來確保您的Singleton方法僅在其中一個節點中運行。零持久節點選項完美地滿足此目的。您需要做的就是啟用此選項並檢查uniGUI應用程序中的Node Id。如果名為NodeZero的ServerModule中的布爾屬性為True,則運行后台任務是安全的。

在下面的代碼中,只在當前節點是Node Zero(Node Id = 0)時才執行ThreadTimer事件。

procedure TUniServerModule.UniThreadTimer1Timer(Sender: TObject);
begin
  if NodeZero then // run code if I'm Node #0 
  begin
 
    // Your task here
 
  end;
end;

或者,如果您計划使用HyperServer或傳統的單一進程模式部署應用程序,則可以使用以下語法。

procedure TUniServerModule.UniThreadTimer1Timer(Sender: TObject);
begin
  if NodeZero or (not NodeMode) then // run code either if I'm Node #0 or I'm not a Node!
  begin
 
    // Your task here
 
  end;
end;

 


免責聲明!

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



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