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的博客

相關文章
相關標籤/搜索