Pomelo的Router
在pomelo中,对服务器的扩充非常简单,只需要修改一下配置文件config/servers.json,多添几台服务器配置就行了,如果我们的connector和chat都具有多台服务器,因此需要考虑对用户请求的服务器分配问题
1.对于gate服务器来说,由于有多个connector,所以需要从中选择一个服务器的信息进行返回,这里我们增加了一个工具函数dispatch,它完成具体的分配运算,他使用用户的uid的crc32的校验码与connector服务器的个数取余,从而得到一个connector服务器,大致代码如下:
module.exports.dispatch = function(key, list) {
var index = Math.abs(crc.crc32(key)) % list.length;
return list[index];
};
2.对应chat服务器,需要选择由哪台chat服务器来服务,也就是前端服务器把这个客户端请求路由到哪个后端服务器上。配置路由使用application的route调用,这里我们也使用了前面提到的工具函数dispatch,使用同样的服务器分配策略,示例如下:
var chatRoute = function(session, msg, app, cb) {
var chatServers = app.getServersByType('chat');
if(!chatServers || chatServers.length === 0) {
cb(new Error('can not find chat servers.'));
return;
}
var res = dispatcher.dispatch(session.get('rid'), chatServers);
cb(null, res.id);
};
app.configure('production|development', function() {
app.route('chat', chatRoute);
});
其中chatRoute就是路由函数,他接受四个参数,返回一个其选择的后端服务器id,四个参数中,第一个是专门用作路由计算的参数,前端服务器路由请求给后端服务器发rpc调用时,会使用session作为计算路由的参数,但是当用户自定定义rpc的时候,用户完全可以自己定义这个参数的含义,当然也可以使用session。第二个参数msg描述了当前rpc调用的所有信息,包括调用的服务器类型,服务器名字,具体的调用方法等信息。第三个参数是一个上下文变量,一般情况下会由app来充当,第四个是一个获得到后端服务器id后的回调函数。
pomelo如果采用hybridconnector的方式,路由信息还可以压缩,即在客户端与服务器建立连接的握手过程中,服务器会将整个字典传给客户端,这样在以后的通信中,对于路由信息,将全部使用定义的小整数进行标记,大大地减少了额外信息开销,目前pomelo提供了基于字典的路由信息压缩。
- 对于服务端,pomelo会扫描所有的Handler信息
- 对于客户端,用户需要在config/dictionary.json中声明所有客户端使用的路由。
比如,在config/dictionary.json里
[
'onChat',
'onAdd',
'onLeave'
]
然后在app.js中配置
app.configure('production|development','connector', function() {
app.set('connectorConfig', {
connector: pomelo.connectors.hybridconnector,
heartbeat: 3,
useDict: true // enable dict
});
});
app.configure('production|development','gate', function() {
app.set('connectorConfig', {
connector: pomelo.connectors.hybridconnector,
useDict: true // enable dict
});
});
Pomelo的Router的更多相关文章
- pomelo 服务器开发常用术语
gate服务器 一个应用的gate服务器,一般不参与rpc调用,也就是说其配置项里可以没有port字段,仅仅有clientPort字段,它的作用是做前端的负载均衡.客户端往往首先向gate服务器发出请 ...
- 给Pomelo的聊天室添加time的RPC调用
为了练手,给聊天应用增加一个rpc调用和一个time类型的服务器,在servers/time/remote/timeRemote.js中,添加如下代码: module.exports.getCurre ...
- Pomelo术语解释
gate服务器 一个应用的gate服务器,一般不参与rpc调用,也就是说其配置项里可以没有port字段,仅仅有clientPort字段,它的作用是做前端的负载均衡.客户端往往首先向gate服务器发出请 ...
- Nodejs学习笔记(十六)--- Pomelo介绍&入门
目录 前言&介绍 安装Pomelo 创建项目并启动 创建项目 项目结构说明 启动 测试连接 聊天服务器 新建gate和chat服务器 配置master.json 配置servers.json ...
- Nodejs学习笔记(十六)—Pomelo介绍&入门
前言&介绍 Pomelo:一个快速.可扩展.Node.js分布式游戏服务器框架 从三四年前接触Node.js开始就接触到了Pomelo,从Pomelo最初的版本到现在,总的来说网易出品还算不错 ...
- Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现
前言: 前面分析了APP的现状以及业务组件化的一些探讨(Android业务组件化之现状分析与探讨),以及通信的桥梁Scheme的使用(Android业务组件化之URL Scheme使用),今天重点来聊 ...
- ASP.NET Core的路由[3]:Router的创建者——RouteBuilder
在<注册URL模式与HttpHandler的映射关系>演示的实例中,我们总是利用一个RouteBuilder对象来为RouterMiddleware中间件创建所需的Router对象,接下来 ...
- ASP.NET Core的路由[2]:路由系统的核心对象——Router
ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路由参数的形式解析出来供后续请求处理流 ...
- Angular2学习笔记——路由器模型(Router)
Angular2以组件化的视角来看待web应用,使用Angular2开发的web应用,就是一棵组件树.组件大致分为两类:一类是如list.table这种通放之四海而皆准的通用组件,一类是专为业务开发的 ...
随机推荐
- mysql基础---日志文件
一 基本日志文件 MYSQL有不同类型的日志文件(各自存储了不同类型的日志),从它们当中可以查询到MYSQL里都做了些什么,对于MYSQL的管理工作,这些日志文件是不可缺少的. 1.错误日志(The ...
- python之路:进阶 二
c = collections.Counter( Counter({ b = collections.Counter( b.update(c) Counter({ Counter({ ...
- ICE第三篇------一些疑难点
1 间接代理 参考http://blog.sina.com.cn/s/blog_53e8499c0100lkoo.html IceGrid用于支持分布式网络服务应用,一个IceGrid域由一个注册表( ...
- 转 java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException
转自:http://blog.csdn.net/zb0567/article/details/7893063 java.lang.ClassNotFoundException: org.apache. ...
- Android IBinder的linkToDeath介绍
先看官方解释: The linkToDeath() method can be used to register a IBinder.DeathRecipient with the IBinder, ...
- 利用 gperftools 对nginx mysql 内存管理 性能优化
利用 gperftools 对nginx 与 mysql 进行 内存管理 性能优化 降低负载. Gperftools 是由谷歌开发.官方对gperftools 的介绍为: These tools ...
- 基于Keepalvied的Mysql主主漂移(切换)
Keepalived实现原理:Keepalived详细介绍简介 实验环境 Master1.Amoeba--IP:192.168.1.5 Master2---IP:192.168.1.10 同时安装ke ...
- MySQL 索引的使用
一.or 的使用 (1)MySQL版本大于 5.x 的会使用 index merge 功能,即可以将多个单列索引集合起来使用,不过在查询时使用 or 的话,引擎为 myisam 的会开启 index ...
- Zbus 笔记
http://blog.csdn.net/cx308679291/article/details/50113257 Zbus学习笔记 标签: zbus 2015-11-30 15:55 266人阅读 ...
- 用PS给图标添加外发光效果
最近在做app的时候用到了图标需要根据点击和非点击显示两种状态(原始状态和外发光状态). 如下图: 没办法,因为这是毕业设计的东西,总不能叫同事帮忙处理下.所以自己充当了回美工. 做法如下: 1.打开 ...