網易開源游戲服務器框架 pomelo 發布 0.5 版
在0.5版本中,主要增強了Pomelo高可用的特性,包括master服務器的高可用和其它服務器的可配置自動重啟,另外還提供一個全局的globalChannel和服務器進程與cpu綁定的功能。
## master 高可用
Pomelo 雖然是分布式服務器框架,但是作為全局控制器的master節點卻是唯一的。為了提高整體服務的可用性,我們0.5版中引入了基于Zookeeper的master高可用功能。
Master高可用是通過Zookeepr 實現的,因此如果要使用這一功能,需要第三方Zookeeper服務的支持。而Master高可用依賴于Zookpeer服務,因此建議作為第三方服務的Zookeeper本身要實現高可用。
### 實現原理
master高可用采用多機熱備技術,采用主Master+多個備份Master節點的方式實現高可用。當主master宕機時,某一個從master會自動接管主master的工作,并與其他服務器建立連接,繼續提供服務,這一過程全部是自動進行的。
### 使用說明
要開啟Master高可用,只需要在app.js中加入以下配置:
```javascript```
app.configure('production|development', function(){
app.enable('masterHA');
app.set('masterHAConfig',
{
server : '127.0.0.1:2181',
path : '/pomelo/master'
});
});
```
app.enable('masterHA')表示開啟master ha功能,這時服務器會加載zookeeper客戶端,并嘗試連接zookeeper默認端口“127.0.0.1:2181"。用戶可以通過 app.set('masterHAConfig'來加載自定義zookpeeper配置。server表示zookeeper服務器,path表示使用 的zookeeper節點。該節點必須是zookeeper上已經存在并可以正常訪問的節點。
現在有兩種方式啟動從Master節點:
* 第一種方式是在加入高可用配置后修改/config/master.json,采用與主master不同的Ip和端口,然后采用正常方式啟動。這時,如果 有主master啟動的話,Pomelo會自動識別出主Master的存在,在啟動時只會啟動一個master備份節點,而不會重復啟動其他服務。
* 第二種方式是使用命令行工具,直接啟動一個獨立的master節點。
## globalChannel
globalChannel是提供全局的channel服務,其默認實現是通過redis將相關信息存儲,開發者可以根據自身需求開發其它實 現;Pomelo原有的channelService只能在具體某個服務器中創建channel,這種channel只能存儲該服務器的用戶信息,而 globalChannelService則可以創建全局的globalChannel,所有服務器的用戶信息都可以通過globalChannel進行 存儲。
### 使用說明
globalChannel默認不加載,需要使用只需要在app.js中進行配置即可,參考配置如下(開啟redis-server)。
```javascript```
app.configure('production|development', function(){
app.set('globalChannelConfig',
{
host: '127.0.0.1',
port: 6379,
channelManager: mysqlManager
});
});
var mysqlManager = function() {
// necessary methods (refer to redisGlobalChannelManager.js)
}
```
需要使用只需要從application中獲取,即app.get('globalChannelService');如果需要自己配置manager的 實現,只需要在globalChannelConfig中配置channelManager,并參考Pomelo默認的redis的實現完成相應的方法就 可以配置自己的globalChannel;具體的接口可以參考[Pomelo的API說明文檔](http://pomelo.netease.com /api.html)。
## 服務器自動重啟
根據網友的需求,在Pomelo0.5版本中增加了服務器(非master)自動重啟的功能,服務器的自動重啟是以服務器與master服務器的連接狀態 為判斷依據,即當服務器與master服務器斷開后觸發該服務器的重新啟動。建議只對無狀態的服務器配置自動重啟,這樣能夠保證服務器重啟后不影響原系統 的運行。默認情況下服務器不會自動重啟,如果需要開啟自動重啟功能需要在servers.json中進行配置auto-restart,具體配置如下:
```json```
{
"development":{
"connector":[
{"id":"connector-server-1", "host":"127.0.0.1", "port":4050, "clientPort": 3050, "frontend": true}
]
"chat":[
{"id":"chat-server-1", "host":"127.0.0.1", "port":6050, "auto-restart": true}
]
"gate":[
{"id": "gate-server-1", "host": "127.0.0.1", "clientPort": 3014, "frontend": true}
]
}
}
```
## 服務器綁定CPU
為了更加充分的利用服務器的CPU,Pomelo在0.5版本中增加了服務器進程與指定CPU進行綁定,該功能限于linux系統的多核服務器,如果需要將服務器與具體CPU進行綁定,只需要在servers.json中進行配置,具體配置如下:
```json```
{
"development":{
"connector":[
{"id":"connector-server-1", "host":"127.0.0.1", "port":4050, "clientPort": 3050, "frontend": true, "cpu": 2}
]
"chat":[
{"id":"chat-server-1", "host":"127.0.0.1", "port":6050, "cpu": 1}
]
"gate":[
{"id": "gate-server-1", "host": "127.0.0.1", "clientPort": 3014, "frontend": true, "cpu": 3}
]
}
}
```
## 自定義服務器關閉前事件
為了讓開發者能夠在服務器關閉前自定義處理事件,在Pomelo0.5版本中增加了這種服務器生命周期的自定義事件。開發者可以通過application對象的beforeStopHook方法添加自定義事件,示例代碼如下:
```javascript```
app.configure('production|development', 'connector', function() {
var fun = function(app, cb){
//do something
cb();
}
app.beforeStopHook(fun);
});
```
pomelo 是由網易開發的基于node.js開發的高性能、分布式游戲服務器框架, 也可作為高實時web應用框架。
Pomelo的應用范圍
pomelo最適合的應用領域是網頁游戲、社交游戲、移動游戲的服務端,開發者會發現pomelo可以用如此少的代碼達到強 大的擴展性和伸縮性。當然還不僅僅是游戲,很多人斷言未來的web時代是實時web應用的時代, 我們發現用pomelo開發高實時web應用也如此合適, 而且伸縮性比其它框架好。目前不推薦將pomelo用于大型的MMO rpg游戲開發,尤其是3d游戲, 還是需要象bigworld這樣的商用引擎來支撐。
Pomelo的理念
pomelo的第一個理念是讓游戲(高實時web應用)服務器的開發變得非常簡單, 而不是解決某類算法或系統上的難題。這個設計理念跟rails是很類似的;第二個理念是重視性能和可伸縮性,用戶用pomelo開發出來的游戲天生具有很 強的伸縮性,擴展也很容易。我們在性能優化上也花了很多功夫,并且會持續進行;第三個理念是讓第三方很容易擴展,框架用了很多插件式的設計, 組件component、路由規則、甚至管理控制臺都可以完全由第三方擴展。
Pomelo的框架組成
pomelo包括三部分:
- 框架, pomelo的核心, 與以往單進程的游戲框架不同, 它是高性能、分布式的游戲服務器框架,并且使用很簡單
- 庫, 包括了開發游戲的常用工具庫, 如人工智能(ai), 尋路, aoi等
- 工具包, 包括管理控制臺, 命令行工具, 壓力測試工具等
pomelo特性
- 快速、易上手的游戲開發模型和api
- 高可伸縮的多進程架構, 支持MMO的場景分區和其它各類分區策略
- 方便的服務器擴展機制,可快速擴展服務器類型和數量
- 方便的請求、響應、廣播、服務器通訊機制, 無需任何配置
- 注重性能,在性能、可伸縮性上做了大量的測試、優化
- 提供了較多擴展組件,包括游戲開發常用的庫和工具包
- 提供了完整的MMO demo代碼(客戶端html5),可以作為很好的開發參考
- 基于socket.io開發,支持socket.io支持的多種語言客戶端
為什么使用pomelo?
高并發、高實時的游戲服務器的開發是很復雜的工作。跟web應用一樣, 一個好的開源容器或開發框架可以大大減少游戲開發的復雜性,讓開發變得更加容易。
遺憾的是目前在游戲服務器開發領域一直沒有太好的開源解決方案。 pomelo將填補這個空白, 打造一款完全開源的高性能(并發)游戲服務器框架。 pomelo的優勢有以下幾點:
- 架構的可伸縮性好。 采用多進程單線程的運行架構,擴展服務器非常方便, node.js的網絡io優勢提供了高可伸縮性。
- 使用非常容易, 開發模型與web應用的開發類似,基于convention over configuration的理念, 幾乎零配置, api的設計也很精簡, 很容易上手。
- 框架的松耦合和可擴展性好, 遵循node.js微模塊的原則, framework本身只有很少的代碼,所有component、庫、工具都可以用npm module的形式擴展進來。任何第三方都可以根據自己的需要開發自定義module。
- 提供完整的開源MMO游戲demo參考(基于HTML 5)。 一個超過1萬行代碼的游戲demo,使開發者可以隨時借鑒demo的設計與開發思路。
在線演示:http://pomelo.netease.com/demo.html