zanePerfor前端监控平台性能优化之数据库分表

HI!,你好,我是zane,zanePerfor是一款最近我开发的一个前端性能监控平台,如今支持web浏览器端和微信小程序段。html

我定义为一款完整,高性能,高可用的前端性能监控系统,这是将来会达到的目的,现今的架构也基本支持了高可用,高性能的部署。实际上还不够,在不少地方还有优化的空间,我会持续的优化和升级。前端

开源不易,若是你也热爱技术,拥抱开源,但愿能小小的支持给个star。git

项目的github地址:

github.com/wangweiange…
github

项目开发文档说明:

blog.seosiwei.com/performance…web


为何要分表

  • zanePerfor能够建立多个应用,并进行数据的上报统计。ajax

  • 每一个应用同类型的数据存放在同一张表中会形成单表的数据存储量很是大,索引文件的体积相应的也会很大。小程序

  • 在单表中,须要对每一个应用的appId作索引,若是分表此索引则可去掉。微信小程序

  • 这样就形成了单表的读写性能都会相应的下降。浏览器


分表的优点

  • 解决了单表的数据存储大小压力bash

  • 解决了单表的读写压力

  • 减小索引字段和索引体积大小

  • 应用解耦与查询性能的提高


分表的劣势

  • 分表惟一的劣势是在Mongodb集群架构中分片变得须要频繁的维护
  • 每新增一个应用,就会动态的新增一张表,若是此表须要作分片,那么就须要初始化一次分片规则


zanePerfor分表图



在zanePerfor中的代码实现:

一、在servers启动时,在app对象下挂载一个models对象,用来存储全部的Schema对象

// 在app.js下挂载models对象

'use strict';

module.exports = async app => {
    app.models = {};
};复制代码

二、须要分表的model中,在app.models下挂载一个按某字段拆分表的方法

'use strict';

module.exports = app => {
    const mongoose = app.mongoose;
    const Schema = mongoose.Schema;
    const conn = app.mongooseDB.get('db3');

    const WebAjaxsSchema = new Schema({
        app_id: { type: String }, 
        create_time: { type: Date, default: Date.now },
        ...
    });


    // ----------拆表代码以下:-----------
    // 此处根据appId拆表
    app.models.WebAjaxs = function(appId) {
        return conn.model(`web_ajaxs_${appId}`, WebAjaxsSchema);
    };

    // ----------默认写法(不拆表)---------
    // return conn.model(`web_ajaxs`, WebAjaxsSchema);
};复制代码


三、调用方式

调用方式也很简单,跟默认的调用方式有一点小区别 (下面以调用单个ajax详情为例)

// 得到单个ajax详情信息
async getDetailForId(appId, id) {
	// ---------拆表调用方式---------
    return await this.app.models.WebAjaxs(appId).findOne({ _id: id }).read('sp').exec() || {};
    
    // ---------默认调用方式---------
    // return await this.ctx.model.WebAjaxs.findOne({ _id: id }).read('sp').exec() || {};

}复制代码


备注:应用根据appId拆表,所以全部查询操做须要传入appId进行查询。

以上只是实践的一种方式,同理,还能够经过 时间日期拆表,其余字段拆表。

zanePerfor暂时只作分表,暂未作分库,已经能知足绝大部分业务需求,若某一天以为不能知足业务需求的时候再考虑是否分库。


文章来源:zane的博客

相关文章
相关标签/搜索