Pomelo的监控模块
对服务器的监控和管理有三个主体:master,monitor,client;master负责收集所有服务器的信息,下发对服务器的操作指令。monitor负责上报服务器状态,并对master的命令作出反应。client是第三方监视的客户端,它注册到master上,通过给master发请求获得服务器群信息,或者给master发指令,管理操作应用服务器群。pomelo中内建实现并使用了console和watchdog这两个admin module,它们是pomelo核心的一部分;由于对于具体的应用来说,需要监控和管理的信息也是各不相同的,pomelo并没有实现固定的监控模块,而是提供了一个可插拔的监控框架机制,用户只需要定义一个监控模块所需要的回调方法,并完成相应的配置即可
一组相关的供不同主体调用的回调函数构成一个admin module,一个admin module中一般包括四个回调方法,monitorHandler,masterHandler,clientHandler, start。其中monitorHandler是monitor收到master的请求或者通知时由monitor回调,masterHandler是master收到monitor的请求或者通知时回调,clientHandler是master收到client的请求或通知时回调的, start是当admin module加载完成后,用来执行一些初始化监控时调用。
为了练手,我们将给我们的聊天应用增加一个监控管理模块,我们在app目录下建立文件modules/timeReport.js:
module.exports = function(opts) {
return new Module(opts);
}
var moduleId = "timeReport";
module.exports.moduleId = moduleId;
var Module = function(opts) {
this.app = opts.app;
this.type = opts.type || 'pull';
this.interval = opts.interval || 5;
}
Module.prototype.monitorHandler = function(agent, msg, cb) {
console.log(this.app.getServerId() + ' ' + msg);
var serverId = agent.id;
var time = new Date().toString();
agent.notify(moduleId, {serverId: serverId, time: time});
};
Module.prototype.masterHandler = function(agent, msg) {
if (!msg) {
var testMsg = 'testMsg';
agent.notifyAll(moduleId, testMsg);
return;
}
console.log(msg);
var timeData = agent.get(moduleId);
if (!timeData) {
timeData = {};
agent.set(moduleId, timeData);
}
timeData[msg.serverId] = msg.time;
};
Module.prototype.clientHandler = function(agent, msg, cb) {
cb(null, agent.get(moduleId));
}
在app.js配置:
var timeReport = require('./app/modules/timeReport');
app.registerAdmin(timeReport, {app: app});
需要注意的是,一个module有两个属性很重要,type和interval,type指出的是数据所采用的方式,有两种pull和push。pull方式是让master定时给monitor发请求,monitor给其上报信息。push的方式则是monitor定时上报自己的信息。interval就是这个信息上报的时间周期了。我们例子中使用的是方式通过opts传入,如果opts中没有配置的话,默认使用pull方式,上报周期为5秒,而实际上,我们就是使用了这样的两个参数值,即使用pull方式,让master主动拉数据,每5秒拉一次。
1.masterHandler的实现中,可能会让人感到迷惑。实际上,由于使用pull的方式,masterHandler会在两种情况下被回调,一种是每隔5秒产生的一次拉数据事件,一种是monitor向master上报信息。这两种情况,可以通过参数msg区分
如果是定时器产生的周期性的拉数据事件导致的回调,此时msg参数是undefined,因此此时只是简单的调用notifyAll,参数moduleId使用来区分到底是哪个监控模块;testMsg参数在这里仅仅用来示例如何传参,在monitorHandler中也仅仅把其打印到console上而已,实际应用中,可以用其传递更有意义的参数;
实际应用中,也经常使用判断msg来区分两种情况的方式。考虑另一种情况,假如使用的不是pull方式,而是push方式的话,那么monitor将会遇到两种情况,与master类似,一种是定时器的周期事件,一种是master给其发了通知或请求,此时也可以通过判断msg进行两种情况的区分,只不过此时将会在monitorHandler中进行判断了。关于这种使用push方式并在monitorHandler中通过判断msg的值进行区分两种情况的实现方式,读者可以自行尝试
2.monitorHandler的实现中,当收到master的通知后,取出了master传来的参数,这里的参数就是testMsg,实际应用中可以使用更复杂的更有实际意义的参数。然后通过对参数进行分析,执行相应的逻辑。这里的逻辑很简单,就是获取自己当前的时间,然后通知给master。
3.clientHandler的实现中,是当有第三方监控客户端给master发请求时,由master进行回调的。为了保持简单,我们这里不再对client做过多的介绍,在开发指南部分会有详细的介绍
Pomelo的监控模块的更多相关文章
- 安装Pomelo 时遇到的坑
一.Pomelo相关的代码地址 https://github.com/NetEase,这里面包含比较多的项目. 2. https://github.com/NetEase/pomelo/wiki/%E ...
- 用Pomelo 搭建一个简易的推送平台
前言 实际上,个人感觉,pomelo 目前提供的两个默认sioconnector和hybridconnector 使用的协议并不适合用于做手机推送平台,在pomelo的一份公开ppt里面,有提到过, ...
- Pomelo:网易开源基于 Node.js 的游戏服务端框架
Pomelo:网易开源基于 Node.js 的游戏服务端框架 https://github.com/NetEase/pomelo/wiki/Home-in-Chinese
- Skynet Pomelo Erlang Elixir 的认识
1.skynet pomelo(node.js) elixir(erlang) 周末研究总结 手游这两年发展来看,感觉对实时性要求越来越高,有同事在研究Elixir开发,google得知这东西是基于e ...
- pomelo架构概览
pomelo之所以简单易用.功能全面,并且具有高可扩展性.可伸缩性等特点,这与它的技术选型和方案设计是密不可分的.在研究大量游戏引擎设计思路基础上,结合以往游戏开发的经验,确定了pomelo框架的设计 ...
- 读pomelo的教程-2
下面从头到尾记录chat demo的Login的过程 client:点击login按钮,取得username和rid两个值 $("#login").click(function() ...
- Windows安装pomelo过程
安装总要出点状况的.操作系统是win7 64bit. 为了保证顺利,打开的是VS2012命令行提示.运行 npm install -g pomelo 经过一系列输出,最后安装提示完成了.但是输入 po ...
- 读pomelo的教程-1
pomelo教程的例子是一个聊天室,包括一个webserver客户端,和一个gameserver的pomelo服务器.这个例子挺好,一个聊天系统逻辑简单,还包括了用户管理,客户端request,服务器 ...
- 选择学习Pomelo
我之前的项目都是基于http做网络通信,但是做多玩家同时对战的游戏,http短连接不支持服务器的push是个问题,这样客户端就没办法收到服务器的消息. 最简单的方法是定时发起request询问服务器, ...
随机推荐
- sql server 字符串替换函数REPLACE
sql server 字符串替换函数REPLACE函数的使用 <pre name="code" class="sql">--参数1:需要替换字符的母 ...
- Asp获取网址相关参数大全
Asp获取网址相关参数大全 代码一:[获取地址中的文件名,不包含扩展名]<%dim Url,FileName,File Url=split(request.servervariables(& ...
- bootstrap-table 表头和内容对不齐解决办法
偶然机会学习bootstrap,表格利用bootstrap-table实现,使用bootstrap-table过程中,发现了一个非常棘手的问题,在ie浏览器中,表格的表头和内容对不齐,特别是列比较多且 ...
- php各项下载地址
Apache2.4下载地址 http://www.apachehaus.com/cgi-bin/download.plx PHP5.6下载地址 http://php.net/downloads.p ...
- smarty的ASSIGN()函数
http://blog.sina.com.cn/s/blog_6721f25c01011qdj.html 主要是把程序里面的值付给模板,因为使用smarty时,模板里面是没有PHP代码的,无法显示在操 ...
- Monkey and Banana(基础DP)
Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- achartengine画出动态折线图
achartengine画出动态折线图的效果最近有个项目需要用到实时曲线图,我也上网搜索了一下,最后还是选择使用achartengine这个现成的东西,毕竟自己再canvas一下实在是太麻烦,而且项目 ...
- mysql表明保存不了,多了空格都不行啊
mysql表明保存不了,多了空格都不行啊
- Android.mk文件详解(转)
源:Android.mk文件详解 从对Makefile一无所知开始,折腾了一个多星期,终于对Android.mk有了一个全面些的了解.了解了标准的Makefile后,发现Android.mk其实是把真 ...
- Android和BLE模块连接通信
首先,进行一下科普: 1.BLE(Bluetooth Low Energy),蓝牙4.0核心profile,主要特点是快速搜索,快速连接,超低功耗保持连接和数据传输,缺点:数据传输速率低,由于其具有低 ...