構建游戲世界的Pebble
願景:出色的游戲服務器端底層框架
現代游戲項目中,為了讓更多的玩家能在一起玩,游戲服務器所需要承載的在線玩家數量越來越多。同時為了讓游戲更好玩,越來越多復雜的業務邏輯都需要放在游戲服務器端上運行。因此,擁有一個同時具備可靈活擴展功能、並且能輕松構建服務器集群的底層框架,變得越來越有必要。這樣游戲程序員可以專心編寫好玩的游戲邏輯,而無需去擔心服務器承載量的問題。
Pebble的含義是“基石”。我們開發這個框架的目標,就是希望它能堅固、可靠,發揮作為基礎開發框架的作用,成為游戲服務器的基礎代碼。Pebble誕生於騰訊公司的游戲研發部公共技術研發中心,這個中心已經為騰訊游戲提供了多年的底層技術和服務支持。從端游、頁游到手游、電視游戲,這個團隊都一直走在游戲研發技術的前列。Pebble這個產品,正是他們多年游戲研發技術的積累和游戲支持經驗的結晶。
價值觀:易用、靈活、雲
Pebble在設計之初,着眼點有三個:易用性;靈活性;雲特性。為了讓更多的游戲開發團隊能很容易的搭建起一個游戲服務器端,Pebble仔細的衡量各種特性,簡化出一套游戲服務器端的最常用范圍里功能庫,並且讓這套代碼僅依靠Linux系統,就可以運行起來。同時,Pebble庫本身也是一個分層良好的SDK,開發團隊既可以使用Pebble的完整功能,快速開發出一個游戲服務器;也可以只抽取其有特色的底層庫,用於增強自己的游戲服務器程序。Pebble為了讓游戲服務器真正的成為一個PaaS雲,還在代碼庫中預制了完整的集群管理方案,可以很方便的在任何的IaaS雲服務器上,搭建游戲服務器。並且,Pebble還能完美的結合騰訊雲的“游戲雲”方案,使任何游戲服務器都能一鍵上雲,省卻所有的安裝、部署、資源規划過程,享受完整的統計、監控服務。
業務特性
-
運行環境:
-
Pebble在Linux系統下運行,以C++靜態庫 + 頭文件的形式發布;
-
客戶端引擎支持:Unity3D(C#庫)、 Cocos2d-x(C++庫);
-
Pebble提供了模板項目工程目錄,以及 代替傳統的make的“blade”編譯工具。(這款工具簡化了以往編寫Makefile的繁瑣過程。但你還是可以使用make或者其他任何編譯工具來構建使用Pebble的工程,因為靜態庫文件和頭文件都是標准的。)
-
通信功能
-
Pebble支持“客戶端-服務器”以及“服務器-服務器”通信。用戶可以使用Pebble提供的庫很簡單的實現手機客戶端對Linux服務器進程的通信;同時Linux服務器進程之間,也可以用Pebble庫簡單實現通信功能。Pebble本身可以同時支持多種傳輸協議和編碼協議,包括TCP和HTTP用於傳輸,Binary和JSON用於編碼,用戶也可以自定義擴展支持的協議。
-
通信功能的接口以RPC形式提供:由用戶編寫一個函數IDL文件[~和facebook著名開源軟件Thrift格式一樣],定義一個函數以及函數的參數,Pebble負責對這個函數構建底層通信代碼。用戶只需要調用自動生成的函數“樁代碼”,遠程的“骨架代碼”函數就會被自動調用,而返回值也會自動回傳給調用方。用戶只需要填寫函數“骨架代碼”的模板空缺,就能實現自己需要的功能。
-
Pebble的RPC除了標准的“請求-響應”模型,還支持“單向RPC”,簡單來說,就是無需等待返回值的RPC,這在游戲中的一些“通知、同步”場景中很實用,能節省不少延遲。另外,Pebble還支持廣播通信的能力:用戶只需要在手機端(服務器端也可),注冊一個“反向RPC”骨架函數,作為接受通知的處理函數,就能從Linux服務器上,向任意數量和組合的終端(包括手機及服務器)廣播數據。需要廣播的目標,是用Pebble提供的API進行分頻道管理。這些頻道數據在整個集群中是自動共享的,因此,你可以使用整個Pebble服務器集群來實現廣播功能,而不需要讓手機客戶端都同時連接到某個特定的服務器上來做廣播。
-
異步框架和協程
-
Pebble本身是一個異步單進程框架,能提供非常高的處理吞吐量,同時也能大大簡化復雜業務邏輯中的並發數據共用問題。因此用戶在使用Pebble的時候,也推薦使用異步的方式來開發業務邏輯。Pebble自身為了支持異步的開發模式,提供了啟動、重載數據、停止服務等幾個常用信號的處理接口,並且也提供了定時器API供業務使用。
-
雖然異步代碼有性能上的優勢,但是代碼的可讀性卻往往比同步代碼要差,因為一個完整的業務流程,可能被切分到多個不同的異步回調代碼中,在閱讀代碼的時候難以有一個完整的流程印象。所以Pebble引入了協程的能力:用戶的每個RPC處理,都會自動建立一個協程。也就是說,用戶可以在編寫RPC的“骨架代碼”內容時,隨時使用Yiled()語句切換出去,然后在異步處理完成后用Resume()切換回來。這樣,一個需要經過多次異步處理的業務邏輯,就可以在同一段函數中完整記錄。除了可以在RPC中使用協程外,定時器的回調函數也會建立一個單獨的協程供業務代碼使用。
-
Pebble所提供的IDL,並不僅僅是一個用於生成RPC代碼的描述語言,它還可以讓用戶以“注解”的方式擴展它的功能。用戶可以只有定義一個對象的各種特性和配置項,以“注解”的語法寫入IDL中,然后這些特有的邏輯,會在“注解”的語法框架下,回調用戶自定義的一些代碼,從而產生千變萬化的能力。比如你可以用注解功能來實現一些特殊的初始化,或者回寫數據對象到特定的存儲設備等等……
-
Pebble框架如同一般框架,還提供了一些實用的雜項功能:從INI文件中讀取配置,用命令行參數或系統變量覆蓋這些配置;提供實用的日子配置和打印功能;設置進程版本號等……
-
數據緩存和持久化
-
游戲業務開發的其中一個特點,就是有大量復雜的業務數據結構。這些數據結構在游戲開發和運營的過程中,往往會需要持續的修改。同時,這些數據結構中的數據,一般都需要在客戶端、服務器端之間傳送,然后在服務端緩存並處理,最后回寫(持久化)到數據庫里。Pebble為了讓這個過程變得簡單,提供了一整套的功能API,讓用戶可以一次性完整的解決通信、緩存、持久化的問題。
-
Pebble提供了一個類似std::map的接口,讓用戶定義的數據結構,可以用put/get的方式放入一個對象池中緩沖。這個對象池是在整個集群中共享的,也就是說任何一個進程put放入一個對象,其他的進程都能get獲得此對象。
-
為了提高性能,Pebble的對象緩存池是具備“本地緩存”能力的,也就是說,如果你持續在一個進程來put/get某個對象,這個對象實際上是在本地機器的內存中緩存的,這可以讓對象緩存的讀寫性能滿足非常高的要求。而多個機器間對象的同步問題,則由Pebble在最終一致性原則下自己解決。
-
為了簡化對象到數據庫的持久化操作,Pebble提供了把對象寫入MySQL數據庫和Redis存儲的內嵌操作。你只需要調用一個Save()函數,就完成了持久化操作;並且你還可以設置自動回寫的持久化操作。對象字段和持久化設備表結構的關聯,並不需要用戶編寫SQL代碼,而是在IDL上簡單的“注解”一下就可以完成。Pebble還支持把對象持久化到騰訊出品的,更強大的專業游戲存儲設備tcaplus雲上。最后,如果你需要支持其他的持久化存儲設備,可以使用Pebble提供的持久化接口API,自己去編寫存儲、讀取操作;也可以利用IDL的注解能力,來定義對象到持久化結構的關系,並關聯執行代碼。
集群特性
-
三種工作模式
由於Pebble是被設計用於構建大規模游戲服務器集群的,因此其自帶了豐富的集群特性。同時,考慮到游戲常常在開發和測試過程中,需要快速搭建一些小型的服務器,所以Pebble也着力簡化服務器的獨立部署。所以Pebble設計了三種模型的集群特征:單服(standalone)、集群(cluster)、雲(cloud)
-
單服模式:用於游戲開發和功能測試,這個模型下,游戲服務器被設計成可不依賴於任何軟件、服務獨立運行。只需要讓你的程序編譯通過,甚至連數據庫都無需連接,就能直接測試。這個模式下的Pebble是具備所有完整功能特性的,所以你無需擔心以后切換模式還要修改代碼。在這種模式下,游戲服務器被限制為一個單獨進程,你可以把整個運行文件和相關目錄,拷貝到任何一個Linux系統上運行。
-
集群模式:Pebble框架編寫的服務進程,可以非常簡單的部署成一個集群。這個集群中的節點自帶了負載均衡、自動容災、動態擴容的能力。這些集群系統中最棘手的問題,你都無需編寫任何代碼就能都解決。你只需要簡單的沿用之前在單服模式下的代碼,然后修改一下啟動的命令行參數(或配置文件),最后啟動幾個后台監控進程。
-
雲模式:在Pebble的集群模式下,其實已經能完成大部分的海量承載的任務。但是如果你還需要更優化的使用硬件資源,就應該使用雲模式。Pebble的雲模式能提供你對集群中資源隔離和動態調整能力,讓你最大效率的利用服務器資源。同時雲服務商也提供WEB界面的完善的統計和監控系統,可以實時掌握整個服務雲的運行情況。
-
對等網絡模型:
在Pebble的集群中,包含兩類進程,一類是“集群中心”進程,負責管理和存儲整個集群的運行時狀況,這類進程由ZooKeeper充當,無需用戶開發;另外一類是“服務進程”,這些進程負責完成業務功能,這些進程由用戶使用Pebble庫開發編譯而成。所有的“服務進程”,都遵循着最簡單的協作邏輯:每個進程都是對等的,它們自己向集群中心報告自己的狀態。當需求發起請求時,都先從“集群中心”處獲得目標進程的具體地址,然后再發起請求。因此Pebble集群具有非常突出的優點:部署非常簡單——每個進程只需要配置自己的服務端口,同時配置一個代表集群的“中心地址”。一旦配置好這兩個地址,就能組建成任何規模復雜的集群。另外,由於“集群中心”的存在,你也可以從中讀取到整個集群的實時狀態,並使用這些信息開發出自己的集群監控管理系統。Pebble為你開發集群管理系統,提供了對應的“服務管理”的API。
-
基於服務路由的伸縮特性:
服務器端代碼的功能,Pebble都以“服務”的概念來封裝,所以服務器伸縮性,也是根據“服務”的請求目標來伸縮的。簡單來說,就是Pebble的“服務”可以在多個服務器上運行,而這些服務器增加和縮減,都不影響“服務”的提供。基本的實現方法,就是由於Pebble集群會對服務請求做路由選擇:選擇那些可用的、符合業務預訂規則的集群節點(服務器)來響應請求。這個過程完全是自動的,你可以kill掉任何一個Pebble集群中的服務進程,服務請求就不會發給這個失效的進程;你可以簡單的啟動一個Pebble服務進程,它將自動加入你想要的集群,然后很快服務請求就會發給這個新加入的進程。另外,在多個服務節點的選擇上,如果業務功能是有一些特定要求的,比如按某個數值做哈希,Pebble也可以支持,只需要在服務請求的時候,把需要哈希的數值送入請求API即可。這大大簡化了以往需要同步在線服務節點狀態,然后計算具體業務路由規則,最后才請求服務的繁瑣過程。
-
狀態無關的服務
在服務器集群中,最難處理的伸縮性和容災問題,就是對有狀態的服務節點進行操作。由於狀態數據有可能在伸縮和容災中丟失,所以就牽涉大量的同步、落地、緩存管理的代碼。這些代碼在大量的服務集群中被反復開發,導致了大量的人力浪費。Pebble對於服務狀態數據的解決方案是“讓服務進程盡量的狀態無關”。Pebble為集群服務進程,提供了一個標准的狀態存儲接口,讓用戶把狀態數據托管給Pebble,這樣用戶就無需自己去維持復雜的狀態有效性和伸縮性了。這個托管的狀態數據接口非常易用,就是一個stl的map接口,只不過這個map是一個分布式存儲的map,它會在調用者本地建立內存緩存(可用共享內存),然后在數據需要修改、冷卻等情況下自動落地(持久化)到存儲設備中;在多個服務節點共用一條記錄的時候,自動完成數據同步的功能。Pebble可以提供數據在最終一致性、弱一致性、強一致性之間的配置和切換,從而提供不同的性能輸出。
升雲之力
-
騰訊雲:分布式計算平台
Pebble是一個具備建立PaaS雲能力的服務框架。因此我們在騰訊雲的基礎IaaS上,搭建了一個可以承載Pebble集群的分布式計算平台。這個平台可以提供Pebble集群的服務部署、資源采購和隔離、統計監控、自動容災、智能伸縮等能力。簡單來說,就是你可以僅僅上傳你的Pebble服務代碼,然后所有的容量設計、硬件采購、部署、監控,都由騰訊雲的分布式計算平台來完成。幾乎所有的技術運維操作,包括擴容縮容、故障恢復、負載均衡都不需要使用者去處理,但是你還是可以很細致的監控到這些事件和效果,也可以介入調整這些自動化的策略。
-
運維監控WEB工具及日志服務
作為一款雲服務的框架,對於運維操作和狀態監控是必然非常重視的。Pebble由於是服務框架,所以它能收集到非常細節的信息,包括每個服務的調用成功率、時延、依賴路徑樹等等。它還可以根據這些動態統計的細節信息,提供詳細的異常報警策略。對於運行中的故障排查,也能提供詳細的記錄和現場信息。這一切的操作,在騰訊雲上,都是有漂亮的WEB界面呈現;同時也提供豐富的RESTful管理接口,可以讓用戶自己定制專用的運維工具。除了運行狀態信息監控外,Pebble本身提供的日志框架,可以對接到騰訊雲的游戲分布式日志統計平台上,這個統計平台可以利用大量服務器並行計算,為你從大量的日志中統計、挖掘出一切你想要的信息。
-
自動化彈性伸縮
作為分布式服務集群,其運維工作一般是非常繁重的。成千上萬的服務器同時運行,硬件、網絡故障很常見;業務的用戶量大幅波動,資源采購回收工作量也很大;產品內容日新月異,更新版本,部署新的運行環境也很頻繁——這一切都需要專業的運維團隊來操作。但是,如果你使用Pebble框架,然后在騰訊雲的分布式計算平台上運營,以上這些復雜的工作,就都會由經驗豐富的騰訊雲團隊和自動化程序來承擔。你所需要做的事情,僅僅是上傳一次你的程序,然后開通一下服務就行了。在業務訪問量小的時候,分布式計算平台會分配較少的資源來運行,以便幫你節省費用;當業務訪問量快速增長的時候,平台會自動的分配充足的資源來接納新的請求量,這個擴容的過程是完全自動完成的;如果你的業務量回落,平台也會智能的降低運行資源,減少你的開銷——這就是自動化的彈性伸縮雲能力。
Pebble框架騰訊互動娛樂事業群(IEG)研發部,在多年支持騰訊游戲經驗積累下,開發的一款通用型游戲服務器端開發框架。此框架的使用非常容易學習,可以在幾乎無依賴的環境下,滿足所有常見的游戲服務器端基礎功能;同時也具備無須修改業務邏輯代碼,就可以建立起海量承載的分布式集群;最后,這個框架還能配合騰訊雲的分布式計算平台,提供自動化運維、豐富運維監控和日志統計、資源智能彈性伸縮的能力。
本項目開源地址:https://github.com/tencent/pebble