• 棋牌手游在线人数监控系统


    1 需求

    对于一款手游来说,知道当前在线的玩家数量是十分重要的,可以做运营分析和掉人故障预警。

    对于一款棋牌游戏,树状结构大致如下:

      房间是基本的采集节点,在服务端程序内部可以实时统计当前房间内的玩家数。

      玩法是一级汇总节点,将挂在自己节点下的房间人数加起来,就是这个玩法的人数

      麻将是二级汇总节点,将挂在自己节点下的玩法人数加起来,就是这个麻将的人数

      所以麻将的人数加起来,就是整个客户端的人数。

    现在需要设计一个报警系统,根据一定判断策略,将一定统计周期内(比如1-2分钟)玩法的掉人邮件发送给指定邮箱(麻将级别的多个负责人)

     

    2 表设计

    首先考虑的是解耦的问题,服务端小伙伴将每个采集节点的数据实时汇报到中间件,然后监控系统过去取数据,这样彼此的开发上就是分离的。

    2.1 数据获取

    这里服务端提供一个web api,将所有采集节点的数据打包成一条json数据,格式如下,使用http get方法获取

    {
        'timestamp':1554876185,'data':
        {
            'roomid_1': 12,
            'roomid_2': 34,
            'roomid_1': 34,
            ...
        }
    }
    

      

    2.2 数据存储

    第一步要把所有roomid的数据采集并存储,这里参考zabbix的mysql表设计,每隔一个采集周期(假设1分钟),到web api获取一次数据并写入mysql。

    CREATE TABLE `gameroom_sec` (
      `roomid` int(8) NOT NULL,
      `clock` int(11) NOT NULL,
      `num` int(4) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    

      

    第二步做玩法级别的数据汇总,对roomid的数据汇总计算后,写入以下表

    CREATE TABLE `gameid_sec` (
      `gameid` int(8) NOT NULL,
      `clock` int(11) NOT NULL,
      `num` int(4) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    

    2.3 报警对象配置  

    设计一张玩法对应麻将项目的表,和麻将项目对应报警邮箱的表

    CREATE TABLE `gameid` (
      `id` int(8) NOT NULL,
      `name` varchar(64) DEFAULT NULL,
      `groupid` int(8) NOT NULL,
      `active` tinyint(1) NOT NULL DEFAULT '1',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

      

    CREATE TABLE `gamegroup` (
      `id` int(8) NOT NULL,
      `name` varchar(64) NOT NULL,
      `mail` varchar(255) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

      

    3 采集脚本

    采集脚本每隔一个采集周期,把web api的数据采集并做修改,然后写入gameroom_sec和gameid_sec表

    4 监控脚本

    对每个玩法做计算,将符合报警策略的玩法,调用报警模块

    from smtplib import SMTP
    from email.header import Header
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    
    def mail(subject, content,mailToAddr):
    
        mailserv = 
        mailport = 
        mailuser = 
        mailpwd = 
    
        from_addr = 
        to_addr = mailToAddr
    
        if to_addr != []:
    
            debuglevel = 0
    
            smtp = SMTP()
            smtp.set_debuglevel(debuglevel)
            smtp.connect(mailserv, mailport)
            smtp.ehlo()
            smtp.starttls()
            smtp.ehlo()
            smtp.login(mailuser, mailpwd)
    
            message = MIMEMultipart()
    
            message['From'] = Header(from_addr, 'utf-8')
            message['To'] = Header(','.join(to_addr), 'utf-8')
    
            message['Subject'] = Header(subject, 'utf-8')
    
            mailMessageText = content
            message.attach(MIMEText(mailMessageText, 'plain', 'utf-8'))
    
            smtp.sendmail(from_addr, to_addr, message.as_string())
            smtp.quit()
    #mailToAddr传进来是个包含多个邮箱地址的列表
    #然后要拼接成用逗号隔开的字符串,传给Header
    

      

    5 邮件展示

  • 相关阅读:
    采购订单打印并预览PDF
    KiCad 如何在原理图添加元件时看到 PCB 封装?
    KiCad 开源元件库收集 (2019-05-31)
    KiCad 的 Digikey 元件库
    MySQL 出现 Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
    AD10 没有原理图是否可以修改 PCB
    KiCad 如何画板框
    当 1117 遇到 MLCC 后
    RequireJS 学习资料收集
    MEMS 硅麦资料收集
  • 原文地址:https://www.cnblogs.com/jabbok/p/10682972.html
Copyright © 2020-2023  润新知