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询问服务器, ...
随机推荐
- javascript 基础 onclick(this)用法介绍
http://www.5idev.com/p-javascript_events_onclick.shtml --------------------------------------------- ...
- angular中控制器之间的通讯方式
1, 利用作用域的继承方式 由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值为基本类型的时候,修改父作用域上面的值会 影响到子作用域,反之,修改子作用域只会影响子作用域 ...
- SSH使用TCP Wrappers实现访问控制
SSH使用TCP Wrappers实现访问控制主要配置文件/etc/hosts.allow/etc/hosts.deny===TCP Wrappers的访问控制原则首先检查 hosts.allow 文 ...
- 用于辅助在 bootstrap-dialog 中的表现:app-jquery-dialog.js
// 用于通某个元素共享配置数据 $.extend($.fn, { formOption : function(showOpt) { var opt = $.data(this[0], "f ...
- function $(id){ return document.getElementById(id); }导致所有的js不能用解决办法。。。。
function $(id){ return document.getElementById(id); } document.getElementById(id) 是获得id这个元素的. 相当于定义了 ...
- Android中使用http协议访问网络
HTTP协议的工作原理:客户端向服务器端发送http请求,服务器端收到请求后返回一下数据给客户端,客户端接受消息并进行解析. 在Android中发送http请求的方式有两种,第一种是通过HttpURL ...
- memcache数据组织
转自:原链接 使用命令 set(key, value) 向 memcached 插入一条数据, memcached 内部是如何组织数据呢 一 把数据组装成 item memcached 接受到客户端的 ...
- Java中的Runtime类
Runtime类描述了虚拟机一些信息.该类采用了单例设计模式,可以通过静态方法 getRuntime()获取Runtime类实例.下面演示了获取虚拟机的内存信息: package Main; publ ...
- select取值问题
全栈攻城狮们给挖了各种坑..其中一个典型是select控件取值.直接上代码: <!DOCTYPE html> <html lang="en"> <he ...
- UIAlertController 自定义输入框及KVO监听
UIAlertController极大的灵活性意味着您不必拘泥于内置样式.以前我们只能在默认视图.文本框视图.密码框视图.登录和密码输入框视图中选择,现在我们可以向对话框中添加任意数目的UITextF ...