HI!,你好,我是zane,zanePerfor是一款最近我开发的一个前端性能监控平台,现在支持web浏览器端和微信小程序段。
我定义为一款完整,高性能,高可用的前端性能监控系统,这是未来会达到的目的,现今的架构也基本支持了高可用,高性能的部署。实际上还不够,在很多地方还有优化的空间,我会持续的优化和升级。
开源不易,如果你也热爱技术,拥抱开源,希望能小小的支持给个star。
项目的github地址:
项目开发文档说明:
为什么要分表
zanePerfor可以创建多个应用,并进行数据的上报统计。
每个应用同类型的数据存放在同一张表中会造成单表的数据存储量非常大,索引文件的体积相应的也会很大。
在单表中,需要对每个应用的appId做索引,如果分表此索引则可去掉。
这样就造成了单表的读写性能都会相应的降低。
分表的优势
解决了单表的数据存储大小压力
解决了单表的读写压力
减少索引字段和索引体积大小
应用解耦与查询性能的提升
分表的劣势
- 分表唯一的劣势是在Mongodb集群架构中分片变得需要频繁的维护
- 每新增一个应用,就会动态的新增一张表,如果此表需要做分片,那么就需要初始化一次分片规则
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的博客