費立寧
同濟大學軟件學院,上海 201804
隨著網絡游戲等云計算產業的爆發式增長,設計實現優秀的云計算架構已成為當前架構師面臨的最大挑戰之一。
以網絡游戲為代表的云計算網絡服務要求其架構具有可靠、容錯、持續、高效、伸縮等特性。當前應用的架構實踐都無法穩定,一致,經濟并一般性的滿足所有這些特性。
Darkstar提供了通用,健壯,高效,可伸縮并簡單易用的基礎框架,它使開發者專注于服務的功能特性而非物理,通訊等基礎設施。同時它又是簡單一致容易使用的一般性網絡服務框架。
傳統的服務器擴展方法是將整個應用區域分成多個區,不同的區運行在不同的服務器上。這帶來兩個問題,一個是處于不同區的用戶不能互相交互,另外一個是如果某個區發生的動作較少時,會出現服務器資源未被充分利用的情況。而在darkstar的處理方式下,所有的處理被分割成為一個個小的執行單元(task),這些task可以在組成網絡的任何服務器上執行,當用戶增加時,系統自動增加處理線程,不再需要為了擴展而將不同的區分配到不同的服務器上面。這樣既提高了資源利用率,又可以讓所有的用戶進行交互。此架構允許系統以一種線性的方式擴展來滿足計算資源日益增長的需求。額外的需求通常是由于同時在線用戶數量的增加、應用程序復雜性的增加或者兩者同時發生引起的。無論哪種方式引起的,考慮到應用運行時的動態行為,面對增加的任務負載,該架構都自動地執行負載平衡來給與響應。當需要更多的容量時,簡單地增加更多的計算節點到可用的服務器池中。多個應用甚至可以共享計算中心的服務器。
Darkstar服務被設計為可以部署在服務器集群上,并可根據需要動態插入移除若干服務器,為達成此目標,Darkstar對像被盡可能的設計為可遷移的。
Darkstar的核心概念是托管對象(Managed Object)。托管對象必須實現ManagedObject和Serializable接口,并被DataManger管理于名為Object Store的對象池中。托管引用(Managed Reference)是指向托管對象的引用,提供了對托管對象的訪問能力。一個Darkstar應用程序內的若干托管對象通過托管引用聯系在一起。托管對象是Darkstar設計的關鍵抽象,代表一個聚合狀態實體,同時又是一個可在各分布式服務器虛擬機間動態遷移的單位。Darkstar提供了api屏蔽了多數的底層復雜性,例如線程調度,事務處理等等,應用程序只需要開發并裝配自己的對象,監聽響應客戶端事件,自己管理持久化的 ManagedObject對象生命周期即可。雖然 Darkstar 項目基礎結構提供的是可擴展的多線程多節點環境,但是游戲服務器開發者卻如同在單機器和單線程的環境中編寫代碼。該模型最小化或消除了數據存取競爭、線程調度和工作負載分布問題,使得開發者可以集中精力編寫應用,而不必關注可伸縮的系統機制。眾所周知,編寫一個復雜、多線程的應用程序是一件困難且辛苦的事情,而擁有成功開發此類應用程序經驗和技能的程序員又少之又少。使用Darkstar項目基礎結構,開發復雜性將會極大地減小。
Darkstar有兩種通信模型。一種是客戶端/服務器端的通信,即每個客戶端只和服務器端通信,由服務器端來負責數據的處理和轉發;另外一種是通道(channel)機制 (類似一對多的廣播),通道由服務器端創建并維護,每個通道可以添加多個客戶端,服務器端可以監聽通道中的所有通信或者具體某個客戶端的通信。也可以給通道中的全部或者部分客戶端發送消息。加入通道的客戶端可以收到其它任何客戶端發送的消息。通道下面客戶端之間的通信不需要服務器端的介入。
會話(Session)提供了一個網絡節點間低延遲的通信機制,抽象了客戶端和服務器端之間的通信。通道提供了一個主題訂閱式的通信機制。在一個會話加入某通道(Channel)后,任何通道內的其它成員會話都可收到此會話的消息。最重要的是,會話和通道都是可遷移的,可以像托管對象一樣根據動態負載變化在各服務器間遷移。
Darkstar為開發者提供了一個簡單的單線程事件驅動的編程模型,在每個事件處理中,數據所有權是單一確定的,這使開發者遠離競態和死鎖噩夢。這些事件處理被編碼在一個任務(Task)中。任務由任務管理器(Task Manager)調度,并且也是可遷移的。在這個過程中托管引用起了重要作用,系統通過它將并發調用合理調度為串行調用。另一方面,這些設計也使托管對象自動具有了事務性,讓完整而一致的對象狀態遷移成為了可能。
Darkstar世界中的一切對象都是可遷移的,這給了它無限擴展的可能,動態負載均衡的能力,不必從項目的開始階段就困擾于程序的物理部署,邏輯分割,通信機制等若干層面的交叉影響,以最小的代價享有可靠、容錯、持續、高效、伸縮等諸多特性。Darkstar讓這個領域更卓越的實踐成為了可能。
[1]ht tp://www.projectdarkstar.com.
[2]ProjectDarkstarServerApplicationTutorial.
[3]ProjectDarkstarClientSDKTutorial.