zanePerfor前端監控平臺效能優化之資料庫分表

zane1發表於2018-12-04

HI!,你好,我是zane,zanePerfor是一款最近我開發的一個前端效能監控平臺,現在支援web瀏覽器端和微信小程式段。

我定義為一款完整,高效能,高可用的前端效能監控系統,這是未來會達到的目的,現今的架構也基本支援了高可用,高效能的部署。實際上還不夠,在很多地方還有優化的空間,我會持續的優化和升級。

開源不易,如果你也熱愛技術,擁抱開源,希望能小小的支援給個star。

專案的github地址:

github.com/wangweiange…

專案開發文件說明:

blog.seosiwei.com/performance…


為什麼要分表

  • zanePerfor可以建立多個應用,並進行資料的上報統計。

  • 每個應用同型別的資料存放在同一張表中會造成單表的資料儲存量非常大,索引檔案的體積相應的也會很大。

  • 在單表中,需要對每個應用的appId做索引,如果分表此索引則可去掉。

  • 這樣就造成了單表的讀寫效能都會相應的降低。


分表的優勢

  • 解決了單表的資料儲存大小壓力

  • 解決了單表的讀寫壓力

  • 減少索引欄位和索引體積大小

  • 應用解耦與查詢效能的提升


分表的劣勢

  • 分表唯一的劣勢是在Mongodb叢集架構中分片變得需要頻繁的維護
  • 每新增一個應用,就會動態的新增一張表,如果此表需要做分片,那麼就需要初始化一次分片規則


zanePerfor分表圖

zanePerfor前端監控平臺效能優化之資料庫分表


在zanePerfor中的程式碼實現:

1、在servers啟動時,在app物件下掛載一個models物件,用來儲存所有的Schema物件

// 在app.js下掛載models物件

'use strict';

module.exports = async app => {
    app.models = {};
};複製程式碼

2、需要分表的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);
};複製程式碼


3、呼叫方式

呼叫方式也很簡單,跟預設的呼叫方式有一點小區別 (下面以呼叫單個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的部落格


相關文章