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这种通放之四海而皆准的通用组件,一类是专为业务开发的 ...
随机推荐
- mknod用法以及主次设备号【转】
转自:http://www.cnblogs.com/hnrainll/archive/2011/06/10/2077583.html mknod 用途 创建特殊文件. mknod Name { b | ...
- Android Studio的使用(三)--包不分级、修改包名
1.如果不喜欢将包逐级展开的话,可以将每一个包名都完整展现出来,只需要勾选Flatten Packages. 2.修改包名 3.填写新的包名 4.点击确认
- myEclipse 8.5下SVN环境的搭建
myEclipse 8.5下SVN环境的搭建 在应用myEclips 8.5做项目时,svn会成为团队项目的一个非常好的工具,苦苦在网上寻求了一下午,终于整合好了这个环境,在这里简单介绍下,希望能为刚 ...
- 手机访问pc网站,自动跳转到手机网站
<script type='text/javascript'> var browser = { versions: function () { var u = navigator.user ...
- Nginx日志配置及日志切割
日志配置 日志对于统计排错来说非常有利的.本文总结了nginx日志相关的配置如access_log.log_format.open_log_file_cache.log_not_found.log_s ...
- C socket udp方式发数据
#define HOST_SERVER_IP "192.168.3.35" #define HOST_PORT 9501 #define SLEEP_TIME 1 #define ...
- PHPCMS快速建站系列之搜索功能
默认模板的搜索功能代码 <div class="bd"> <form action="{APP_PATH}index.php" method= ...
- winscp 秘钥登录
如题 如果不想用密码登录,可以选择用秘钥文件登录winscp 原理和linux分发ssh公钥是一个道理 1:在被管理的机器上分发公钥 ,出现 authorized_keys才可以 完成服务端配置 2: ...
- WPF 制作电子相册浏览器
周末的时候,闲着无聊,做了一个电子相册浏览器.比较简单.界面如下: 主要部分代码如下: MainWindow.xaml <local:HeaderedWindow x:Class="P ...
- Android L(5.0)源码之手势识别onTouchEvent
onTouchEvent同样也是在view中定义的一个方法.处理传递到view 的手势事件.通过MotionEvent的getAction()方法来获取Touch事件的类型,类型包括ACTION_DO ...