• 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做过多的介绍,在开发指南部分会有详细的介绍

  • 相关阅读:
    查漏补缺:2020年搞定SpringCloud面试(含答案和思维导图)
    如何在半小时搭建一个简单的日志分析平台?
    Flutter | 状态管理特别篇——Provide
    线程池是怎样工作的
    神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程
    github设置添加ssh
    pytorch中torch.cat(),torch.chunk(),torch.split()函数的使用方法
    八年以后,我选择了创业
    vue源码解读(一)Observer/Dep/Watcher是如何实现数据绑定的
    Ubuntu18.04安装Pytorch
  • 原文地址:https://www.cnblogs.com/fuland/p/4001098.html
Copyright © 2020-2023  润新知