对服务器的监控和管理有三个主体: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的监控模块的更多相关文章

  1. 安装Pomelo 时遇到的坑

    一.Pomelo相关的代码地址 https://github.com/NetEase,这里面包含比较多的项目. 2. https://github.com/NetEase/pomelo/wiki/%E ...

  2. 用Pomelo 搭建一个简易的推送平台

    前言 实际上,个人感觉,pomelo 目前提供的两个默认sioconnector和hybridconnector 使用的协议并不适合用于做手机推送平台,在pomelo的一份公开ppt里面,有提到过, ...

  3. Pomelo:网易开源基于 Node.js 的游戏服务端框架

    Pomelo:网易开源基于 Node.js 的游戏服务端框架 https://github.com/NetEase/pomelo/wiki/Home-in-Chinese

  4. Skynet Pomelo Erlang Elixir 的认识

    1.skynet pomelo(node.js) elixir(erlang) 周末研究总结 手游这两年发展来看,感觉对实时性要求越来越高,有同事在研究Elixir开发,google得知这东西是基于e ...

  5. pomelo架构概览

    pomelo之所以简单易用.功能全面,并且具有高可扩展性.可伸缩性等特点,这与它的技术选型和方案设计是密不可分的.在研究大量游戏引擎设计思路基础上,结合以往游戏开发的经验,确定了pomelo框架的设计 ...

  6. 读pomelo的教程-2

    下面从头到尾记录chat demo的Login的过程 client:点击login按钮,取得username和rid两个值 $("#login").click(function() ...

  7. Windows安装pomelo过程

    安装总要出点状况的.操作系统是win7 64bit. 为了保证顺利,打开的是VS2012命令行提示.运行 npm install -g pomelo 经过一系列输出,最后安装提示完成了.但是输入 po ...

  8. 读pomelo的教程-1

    pomelo教程的例子是一个聊天室,包括一个webserver客户端,和一个gameserver的pomelo服务器.这个例子挺好,一个聊天系统逻辑简单,还包括了用户管理,客户端request,服务器 ...

  9. 选择学习Pomelo

    我之前的项目都是基于http做网络通信,但是做多玩家同时对战的游戏,http短连接不支持服务器的push是个问题,这样客户端就没办法收到服务器的消息. 最简单的方法是定时发起request询问服务器, ...

随机推荐

  1. linux下的安装百度云网盘

    linux下的百度网盘 (2014-10-20 18:01:14) 标签: linux 百度网盘 网盘 百度 forlinux 分类: 技术博文 百度网盘说实话,其实我挺喜欢的,好处什么的,就不说了, ...

  2. 简单的java高斯模糊算法

    import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOEx ...

  3. JS学习随手笔记

    ===================字符串===================== 字符串中间的空格也是要算长度的. 每一个字符都可以返回对应的Unicode 编码 文字的简单加密都是通过char ...

  4. jdb

    http://herongyang.com/jtool/jdb.html http://www.rhcedan.com/2010/06/22/killing-a-java-thread/ 用处:上去杀 ...

  5. The 2014 ACMICPC Asia Invitational Xian

    上半年邀请赛的时候真是险而又险地2题拿了个铜,确实其实跟没拿一样......现场前复盘一下,长长记性 [A]签到题 [B]最短路+DFS [C]最短路 [D]构造+欧拉回路 [E]数论,最佳平方逼近 ...

  6. iOS下bound,center和frame

    本文转发至:http://www.xuebuyuan.com/1846606.html 在写程序的时候发现,iOS下的坐标.位置很容易弄乱,特别是在不同的坐标系统中,必须完成弄明白一些概念才能做相应的 ...

  7. <Natural Language Processing with Python>学习笔记二

    用Enthought Canopy作图果然方便.昨天频频出现无法识别pylab模块的异常,今天终于搞好了.以下是今天出来的图:

  8. kafka第五篇

    架构设计:http://www.linuxeden.com/html/news/20130309/136716_2.html 代码实现consumer 和producer

  9. Mac快速查看某条命令的版本和存放的位置(ls -l `which mvn`)

    输入: ls -l `which mvn` 如图:

  10. STM32启动模式及API(转)

    源:STM32启动模式及API 我们玩ARM9,一般都是在内存里调试程序,速度飞快.STM32下也可以这样,虽说现在的flash寿命已经很长了,但flash中调试烧录程序还是一个很慢的过程,有时候程序 ...