騰訊互娛開源分佈式開發框架 Pebble

做者: 韓偉 

構建遊戲世界的Pebble

願景:出色的遊戲服務器端底層框架

現代遊戲項目中,爲了讓更多的玩家能在一塊兒玩,遊戲服務器所須要承載的在線玩家數量愈來愈多。同時爲了讓遊戲更好玩,愈來愈多複雜的業務邏輯都須要放在遊戲服務器端上運行。所以,擁有一個同時具有可靈活擴展功能、而且能輕鬆構建服務器集羣的底層框架,變得愈來愈有必要。這樣遊戲程序員能夠專心編寫好玩的遊戲邏輯,而無需去擔憂服務器承載量的問題。git

Pebble的含義是「基石」。咱們開發這個框架的目標,就是但願它能堅固、可靠,發揮做爲基礎開發框架的做用,成爲遊戲服務器的基礎代碼。Pebble誕生於騰訊公司的遊戲研發部公共技術研發中心,這個中心已經爲騰訊遊戲提供了多年的底層技術和服務支持。從端遊、頁游到手遊、電視遊戲,這個團隊都一直走在遊戲研發技術的前列。Pebble這個產品,正是他們多年遊戲研發技術的積累和遊戲支持經驗的結晶。程序員

價值觀:易用、靈活、雲github

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)研發部,在多年支持騰訊遊戲經驗積累下,開發的一款通用型遊戲服務器端開發框架。此框架的使用很是容易學習,能夠在幾乎無依賴的環境下,知足全部常見的遊戲服務器端基礎功能;同時也具有無須修改業務邏輯代碼,就能夠創建起海量承載的分佈式集羣;最後,這個框架還能配合騰訊雲的分佈式計算平臺,提供自動化運維、豐富運維監控和日誌統計、資源智能彈性伸縮的能力。

本項目開源地址:github.com/tencent/peb…

本文來自 韓大 微信公衆號

相關閱讀

使用 Rust 構建分佈式 Key-Value Store

騰訊雲分佈式數據庫可用性系統實踐

Hadoop HA 機制學習

此文已由做者受權騰訊雲技術社區發佈,轉載請註明原文出處

原文連接:https://cloud.tencent.com/community/article/614135?utm_source=jueji


海量技術實踐經驗,盡在騰訊雲社區

相關文章
相關標籤/搜索