pomelo 0.9正式发布

pomelo rpc支持zeromq通信

在pomelo 0.9中提供了基于zmq的rpc调用,开发者可以根据需要选择原有的pomelo-rpc或者pomelo-rpc-zeromq。基于zeromq和原有的pomelo-rpc的性能对比测试结果可以参考:

具体使用方法:

  1. 安装zeromq

  2. 在app.js中进行配置,具体配置如下所示:

var zmq = require('pomelo-rpc-zeromq');

app.configure('production|development', function() {

    app.set('proxyConfig', {
        rpcClient: zmq.client
    });

    app.set('remoteConfig', {
        rpcServer: zmq.server
    });

});

具体使用示例可以参考 chatofpomelo zmq分支

pomelo-rpc-zeromq性能测试报告与原有的pomelo-rpc的性能测试报告可以参考。

pomelo命令行改进

根据网友的建议,在pomelo 0.9版本中增加了重启的命令和服务器单独启动的命令;具体命令如下:

pomelo start -t [server type] 启动某类型的服务器,如果需要分开启动不同类型服务器时候使用,首先必须启动master服务器,例如:

pomelo start -t master
pomelo start -t connector

pomelo start -i [server id] 启动具体某个服务器,同上首先需要启动master,master服务器无需提供具体id, 例如:

pomelo start -i master
pomelo start -i chat-server-1

pomelo restart 重启除了master以为的其它服务器,可能会出现重启失败的情况。

pomelo restart -t [server type] 重启某类型的服务器,不包括master服务器

pomelo restart -i [server id] 重启具体某个服务器,不包括master服务器

pomelo restart -t connector
pomelo restart -i chat-server-1

pomelo rpc增加回调超时机制

针对之前网友提出的rpc回调函数积压问题, 在新版本的pomelo-rpc中通过增加了回调函数的超时机制解决,rpc客户端在记录应用层的回调函数的同时添加对应的定时器,如果rpc服务端收到对应的消息则将定时器清除,如果定时器超时则将对应的回调函数清除。定时器的超时时间开发者可以进行设置,默认是10s, 具体使用如下:

app.set('proxyConfig', {
    timeout: 1000 * 20
});

pomelo支持连接黑名单机制

在新版本的pomelo中连接服务器支持静态或者动态添加ip黑名单功能,服务端可以在连接服务器中增加黑名单对攻击的ip进行屏蔽。

原理

connector每接受一个连接都会抛出一个连接事件, 这个事件中含有该连接的客户端IP. connector会捕获该连接事件, 并调用用户传入的获取IP黑名单的函数, 如果该客户端IP在黑名单中, 则立刻将对应的socket断开. 以此来实现连接服务器的黑名单过滤功能.

使用方法

静态添加黑名单

使用时只需要向在connector的connectionConfig配置中传入一个获取IP黑名单的函数即可, 这个函数需要接受一个回调函数作为其参数, 该回调函数形如function(err, list) {...}. 在获取IP黑名单的函数内, 拿到IP黑名单时(该黑名单应为一维JS Array), 以类似于cb(null, self.list)的形式调用IP过滤回调函数,具体使用方法如下:

./game-server/app/util/blackList.js
... ...
var self = this;
self.blackList = ['192.168.100.1', '192.168.100.2'];
module.exports.blackListFun = function(cb) {
  cb(null, self.blackList);
};
... ...
./game-server/app.js
var blackList = require('./app/util/blackList');
... ...
app.configure('production|development', function() {
... ...
  app.set('connectorConfig', {
      blacklistFun: blackList.blackListFun
  });
... ...
}

动态添加黑名单

动态添加黑名单可以通过pomelo-cli完成,其中运行输入具体ip或者正则表达式,具体命令如下:

blacklist 192.168.100.1
blacklist (([01]?d?d|2[0-4]d|25[0-5]).){3}([01]?d?d|2[0-4]d|25[0-5])

channel 序列化接口

在新版本的pomelo中提供channel的序列化接口,开发者可以通过实现该接口将系统中创建的channel进行保存;同时当服务器重新启动后,系统会将之前保存的channel恢复到系统中。开发者需要实现如下四个接口:

add(key, value, cb)

add key value pairs

remove(key, value, cb)

remove key value pairs

load(key, cb)

load all values

removeAll(key, cb)

remove all values

具体的使用方法如下所示:

var store = require('./store');

app.set('channelConfig', {
            store : store,
            prefix : 'pomelo'
        });
//store.js

var redis = require('redis');

var StoreManager = function() {
  this.redis = redis.createClient(6379, '127.0.0.1', {});
};

module.exports = new StoreManager();

StoreManager.prototype.add = function(key, value, cb) {
  this.redis.sadd(key, value, function(err) {
    cb(err);
  });
};

StoreManager.prototype.remove = function(key, value, cb) {
  this.redis.srem(key, value, function(err) {
      cb(err);
  });
};

StoreManager.prototype.load = function(key, cb) {
    this.redis.smembers(key, function(err, list) {
        cb(err, list);
    });
};

StoreManager.prototype.removeAll = function(key, cb) {
  this.redis.del(key, function(err) {
    cb(err);
  });
};

热重启的部分支持

在新版本的pomelo中对rpc模块进行了改进,在rpc服务端断开连接后,上层应用的rpc请求会在rpc客户端缓存;当rpc服务端恢复后,再次发起rpc请求时,会把之前的rpc请求一起发到rpc服务端。

在系统中如果是rpc单向依赖,也就是说系统中只有A类服务器发送rpc请求到B类服务器,没有B类服务器发送rpc请求到A类服务器,同时B类服务器是没有任何状态信息和实例化信息,这样B类服务器就可以在pomelo 0.9版本中重启,且不会影响系统的正常运行。

具体可以参考chatofpomelo store分支。在chatofpomelo中只有connector到chat服务器的单向rpc依赖,对于chat服务器有channel的实例存在,所以使用channel序列化接口将channel存储,所以需要使用到redis。

操作步骤如下:

  1. 在不同的命令行界面分别执行 pomelo start -t master, pomelo start -t connector, pomelo start -t gate, pomelo start -t chat;
  2. 打开web服务器,运行chatofpomelo;
  3. 关闭chat服务器,并重新启动;

pomelo支持decodeIO protobuf

在pomelo 0.9版本中提供了对decodeIO的protobuf的支持,对于decodeIO的protobuf的介绍可以参考decodeIO-protobufjs.

使用方法

客户端

使用最新的pomelo-jsclient-websocket, 同时在客户端添加命名为pomelo-decodeIO-protobuf的component,并将其挂载到window对象下。对应的component.js如下所示:

{
  "name": "boot",
  "description": "Main app boot component",
  "dependencies": {
    "component/emitter":"master",
    "NetEase/pomelo-protocol": "master",
    "pomelonode/pomelo-decodeIO-protobuf": "master",
    "pomelonode/pomelo-jsclient-websocket": "master",
    "component/jquery": "*"
  },
  "scripts": ["index.js"]
}

对应的index.js如下所示:

var Emitter = require('emitter');
  window.EventEmitter = Emitter;

  var protocol = require('pomelo-protocol');
  window.Protocol = protocol;

  var protobuf = require('pomelo-decodeIO-protobuf');
  window.decodeIO_protobuf = protobuf; 

  var pomelo = require('pomelo-jsclient-websocket');
  window.pomelo = pomelo;

  var jquery = require('jquery');
  window.$ = jquery;

服务端

在服务端需要使用pomelo-protobuf-plugin,并在app.js中使用对应的插件,具体配置如下:

app.configure('production|development', function() {
    app.use(protobuf, {
        protobuf: {
        }
    });
});

注意事项

pomelo原有的protobuf和decodeIO-protobufjs不能同时使用,即不能同时使用pomelo-protobuf-plugin插件并在前端服务器开启useProtobuf。

考虑到与原有的protobuf保持一致,pomelo 0.9版本中支持的decodeIO-protobuf同样采用serverProtos.json和clientProtos.json,不支持decodeIO-protobufjs中的.proto格式,对于.proto格式可以采用decodeIO-protobufjs提供的命令行工具转换成json格式。

具体的使用示例可以参考lordofpomelo decodeIO-protobuf分支。

pomelo websocket支持自动重连

在pomelo 0.9版本中,pomelo-jsclient-websocket 支持自动重连。重连发生在连接断开后的5s后,在重连失败后下次重连的时间将是上次重连时间的2倍;所以重连时间依次为5s, 10s,20s,依次类推。默认最大的重连次数是10次,该参数可以在连接初始化过程中进行配置。

//设置客户端重连

pomelo.init({
        host: 127.0.0.1,
        port: 3050,
        reconnect: true
    }, function() {

});


//设置客户端重连最大次数

pomelo.init({
        host: 127.0.0.1,
        port: 3050,
        reconnect: true,
          maxReconnectAttempts: 20
    }, function() {

});
标签: pomelo公告
py8765 在 2014-2-26 14:35发布
py8765 在 2014-5-3 10:04重新编辑 分享到 weibo
18 回复
#1 wangxy 2014-2-26 15:36 回复

顶~

#2 tuoxiansp 2014-2-26 15:38 回复

顶新版本!

#3 edword2012 2014-2-26 15:40 回复

前排呀呀呀

#4 edword2012 2014-2-26 15:40 回复

先顶再看

#5 lellansin 2014-2-26 16:00 回复

火前留名

#6 wally7 2014-2-26 16:14 回复

果断没有跟上pomelo成长的脚步,已落后.看不懂.

#7 {3} ohmygod 2014-2-26 17:54 回复

IE8下不支持Uint16Array,pomeloclient.js如何解?人气帖子下面,求解

wally7 2014-2-26 18:29 回复

刚好下班

ohmygod 2014-2-26 18:30 回复

@wally7 求解,哈哈

w3hacker 2014-2-27 16:04 回复

@ohmygod 用自定义协议啊 重写encode decode即可

#8 {1} chiuan 2014-2-26 18:36 回复

support,问下. 关于RPC断开消息缓存,会导致堵塞么?

py8765 2014-2-26 18:42 回复

不会的,有限制的。

#9 kevinsui 2014-2-26 22:10 回复

顶一个先

#10 w3hacker 2014-2-27 09:09 回复

好棒啊

#11 w3hacker 2014-2-27 09:30 回复

我0.8.9在mac上的centos 64安装了好几天都安不上 换了0.9.0一下就安上了 谢谢官人

#12 fantasyni 2014-2-27 17:14 回复

顶顶顶

#13 {1} roytan 2014-2-28 09:52 回复

看了新的zeromq和原来rpc的性能对比,性能感觉差不多,官方能讲讲这两种rpc方式有什么差异么?

py8765 2014-2-28 17:00 回复

首先是提供一种选择,另外主要zmq有一些比较好的特性,之前也有网友提到希望提供zmq支持;性能测试结果确实是差不了太多。

#14 {1} roytan 2014-2-28 10:00 回复

官方性能报告:

zeromq rpc:

服务器完成2w次RPC请求的时间为14.595s, 平均1370次/s.
服务器完成一次RPC调用的时间约为: 1-4ms
server进程对CPU的占用为: 36%, 38%, 43%, 35%, 37%

sio rpc: 

服务器完成2w次请求的时间为14.835s, 平均1348次/s.
服务器完成一次RPC调用的时间约为: 2~8ms
echo进程对CPU的占用为: 30%, 20%, 33%, 22%, 25%, 46%, 21%

看上去,处理性能差不多,甚至zeromq的cpu占用还更高,让我更加疑惑引入zeromq的好处在哪里?

zxc122333 2014-3-1 14:04 回复

+1 同感

#15 ao1shib123 2014-3-5 09:49 回复

支持

#16 liuchunyao90 2014-3-10 14:01 回复

阿里云上init的helloworld工程跑不起来,版本0.9.1 node版本0.10.26, 两种连接方式都不行。求指点
前后台服务器都能开,网页能打开,点击test按钮没反应。后端服务器没有任何log

#17 {2} xuyufei 2014-3-18 18:50 回复

网易有用POMELO开发过MMO游戏吗?求产品,求地址

py8765 2014-3-19 09:37 回复

暂时没有,现在有一个推送平台采用pomelo开发

xuyufei 2014-3-19 20:05 回复

@py8765 之前用node自己写了一个游戏服务器,《魔兽幻想》手机卡牌游戏,类似我叫MT,因为不是MMO,所以使用的是单进程,上线之后发现node确实很稳定高效。最近看POMELO比较火,想去研究研究该架构,以后打算使用POMELO。但发现POMELO还没有大型的MMO游戏,所以很期待出现一款POMELO写的大型的MMO游戏,给我们使用者一些鼓励和信心

#18 {1} skyblue 2014-3-28 12:09 回复

decodeIO protobuf 跟已的protobuf有什么大的区别?

py8765 2014-3-28 16:00 回复

你可以在github decodeIO protobuf的主页看看,用法更多,然后支持Long类型

回到顶部