近一年多没在博客园写东西了,从换公司后就一直努力学习公司的框架和业务。而今接手一个电商数据统计项目,在博客园搜索统计项目解决方案却一无所获,最终自己设计并在开发的过程中持续更新,希望可以和大家一起交流。

需求

项目组的电商系统运行了3年多,每天下单量在2w单左右。

1.要求从商户,客户,商品的角度统计每天,每月,任意天数查询的需求。

2.并对部分敏感数据做实时查询,例如下单数,下单金额之类的指标。

3.对客户,商品交易额交易量指标做top并支持导出。

4.按地域统计各个交易指标并做top。

5.不能在原有的系统上做集成,防止影响主业务。

设计思路

服务器采用windows2012 IIS7.5 .netfromwork4.0 数据库是部分sqlserver和部分mysql 基于目前系统的状况和需求,决定采用触发式预统计方式来完成部分重要功能。

何为触发式? 目前多个系统之间通信有消息中间件来处理业务。例如 下单,下单时创建订单后就直接往消息系统中注册一条创建订单任务,任务系统会分发给对应执行者去执行下单相关的后续任务。

根据消息系统的特性,在不掺和主系统的情况下利用下单,支付,等业务触发,完成数据的收集,处理,这就是触发式。

非实时部分

关于预统计呢,其实只要是统计,都绕不过这个方法。数据少的时候我们统计一般采用全表查询,count,groupby等形式来得出结果。但大多数情况下,会重复获取大量数据,每次都统计一遍,不但耗时,而且在数据库性能,数据传输,超时等问题上都是不能容忍的。

因此我们会总结,将可以增量统计的部分采取一点一滴的叠加,每天统计增量数据,将合理的数据结构存储起来(半成品),下次统计或者查询的时候直接查半成品,不仅数据量少,而且不用遍历原来的表。特别是电商系统,每天增量数据大,多会采用分库分表的方式来提高数据库性能和访问速度,但是却给统计造成了困扰。

实时部分

对于部分实时性要求高的指标,就需要我们达到流式计算的要求了。一样采用触发式的任务,在任务中维护一个全局的内存变量,不同商家也可以区分开,另外由于数据实时性和内存大小考虑,需要一个定时推送redis,一个定时定量去移除存储到数据库。

关于定时定量,是指内存中累积到一定个数比如客户交易商品累计到100或者离上次存储已经过去1分钟,这个时候就会触发存储规则。推送也一样,说是实时,但是不可能有变化就推送到redis,那这样用redis就没有意义。按我的想法是每个有交易的商家每分钟推一次,下单任务触发后根据上次推送时间来决定,如果没有交易当然就不推送。

库表设计

统计项目的库表我采用的是查从库,从库拥有和主库一样的表结构,并且只读不写。在分表原则上 将表设计为待统计表,预统计表,按月统计表 按月存储表 并根据数据量分表,让每个表中预期数据不超过1千万,我将部分数据量大的表分为128张,少量的分为16张

极限情况下可以分库,来提升连接数。

流程设计

在提升系统性能和响应速度方面,会采用长缓存+短缓存的方式。例如 不变通用的数据采用长缓存(2-24小时),实时要求敏感数据(1-5分钟)

对于部分慢的地方还可以采用首页缓存,默认参数缓存等方式来提高页面打开速度。

消息系统架构

触发式统计是建立在消息中间件的基础之上的,因此将它的架构和设计思路贴出来,供大家参考和借鉴。消息系统的存在主要有几点好处,1.解耦系统之间的依赖 2.异步执行耗时任务 3.具有可靠的日志和重试机制 4.可分布式部署横向扩展

统计任务中心

触发式统计的核心有两个,一是消息系统 二是统计任务中心。它的职责主要是收集交易数据,管理预统计结果并推送(redis和数据库)。已下列支付为例,它在全局中单例,并负责收集数据,管理(统计,存储,推送)

 总结

这一次,我将统计项目的大体结构和设计思路分享了出来,目前项目还未正式开始 ,后期可能会做调整,改掉不合理的设计。我打算将统计项目作为一个系列,在实现的途中分享,也希望有人能获益,有人能给予指点。

.net数据统计系统设计(中小型)的更多相关文章

  1. 有关“数据统计”的一些概念 -- PV UV VV IP跳出率等

    有关"数据统计"的一些概念 -- PV UV VV IP跳出率等 版权声明:本文为博主原创文章,未经博主允许不得转载. 此文是本人工作中碰到的,随时记下来的零散概念,特此整理一下. ...

  2. TFS工作项数据统计及相关数据库结构分析

    今天为客户的质量管理部门人员提供TFS咨询过程中,客户的质量管理专家基于TFS提出了一个比较棘手的数据统计需求.需求是这样,客户的数十个软件项目通过质量管理部按照年度版本计划进行软件产品系统的发布,因 ...

  3. 常用的数据统计Sql 总结

    最近刚在搞一个BI的项目,里面需要大量的sql 数据统计相关运用,加深了我又对SQL的理解与使用. 所以,分享几个数据统计时常用的sql 语句总结: 1. 统计各个条件下的数据 select Batc ...

  4. Echarts 之三 —— 地市联动数据统计二

    一.简介 除了是一个地图之外,我们也可以使用多地图进行地市.区县联动数据统计.需求如下:展示整改广东省的地图,并显示统计信息,当点击某一个地市的时候,就显示该地市的地图,并统计该地市区县的数据信息.二 ...

  5. Echarts 之二——地市联动数据统计

    一.简介 通过地图可以更直观地展示各个地区的统计数据,能够更清楚地进行数据分析.有些场景下,我们不仅仅需要对每个地市进行统计分析.更需要对地市一下的区县进行数据统计,并进行联动.此事我们可以通过Ech ...

  6. TFS二次开发系列:七、TFS二次开发的数据统计以PBI、Bug、Sprint等为例(一)

    在TFS二次开发中,我们可能会根据某一些情况对各个项目的PBI.BUG等工作项进行统计.在本文中将大略讲解如果进行这些数据统计. 一:连接TFS服务器,并且得到之后需要使用到的类方法. /// < ...

  7. PHP+Mysql+jQuery实现地图区域数据统计-展示数据

    我们要在地图上有限的区块内展示更多的信息,更好的办法是通过地图交互来实现.本文将给大家讲解通过鼠标滑动到地图指定省份区域,在弹出的提示框中显示对应省份的数据信息.适用于数据统计和地图区块展示等场景. ...

  8. python数据统计,总数,平均值等

    一般我们进行数据统计的时候要进行数据摸查,可能是摸查整体的分布情况啊.平均值,标准差,总数,各分段的人数啊.这时候用excel或者数据库统计都不方便. 我要统计的一个文件,太大了,还得分成15个文件, ...

  9. 在Sqlserver下巧用行列转换日期的数据统计

    在Sqlserver下巧用行列转换日期的数据统计 前言 在SQLSERVER 中有很多统计函数的基础语法,有使用Group By 或 partition by 后配合Sum,Count(*) 等用法. ...

随机推荐

  1. ArcEngine保存栅格数据至rastercatalog

    将栅格数据(IRasterDataset)直接保存到数据库中很常见,但是保存到栅格目录下就比较少见,好不容易才找到,在这里记录一下. public void saveRasterDs2Catalog( ...

  2. python无线网络安全入门案例

    原文链接:http://www.devx.com/security/Article/34741 翻译:诸神的黄昏 整理校对:玄魂 --- 随着⽆线⽹络在家庭和商业中的普及,新的安全挑战是⽆法避免的.保 ...

  3. 重温Javascript(二)

    对象 可以想象成散列表,键值对,值可以是数据或函数 创建对象的方式 1.工厂模式 function createPerson(name, age, job){ var o = new Object() ...

  4. 关于ng的路由的几点想法(ui-view)

    在配置路由的时候,我们可以选择ng框架自带的路由,也可以使用第三方路由插件ui-router 注意: (1)在使用angular-ui-router的时候,必须先引入angular-ui-router ...

  5. [原]C#与非托管——初体验

    P/Invokes初看起来非常简单,利用DllImport进行extern函数的声明,程序就可以在调用extern函数的时候自动查询调用到对应的非托管函数,有些类似Java的native函数,但更为简 ...

  6. .net mvc------下拉列表DropDownList控件------绑定数据

    下拉列表 以性别为例 绑定可以了,可以显示了,但有些地方就能传值,有些地方就会出错提示,如有大神请指教.... 错误如下: 具有键"sex"的 ViewData 项属于类型&quo ...

  7. npm 配置和安装 express4.X 遇到的问题及解决

    前言:懒得看前面两篇介绍的也可以从本节直接参考,但建议最好了解下,因为 4.X 的express 已经把命令行工具分离出来 (链接https://github.com/expressjs/genera ...

  8. MySQL学习笔记(四)—存储过程

    一.概述      存储过程是数据库定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程可以避免开发人员重复的编写相同的SQL语句,而且存储过程是在MySq ...

  9. Ubuntu离线安装Sogou拼音(附老版本安装&输入法自启动)

    跨平台系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#linux 离线安装的基础可以看看这篇文章的 前期准备工作 http://www.cnbl ...

  10. huffman编码【代码】

    哈夫曼编码应该算数据结构"树"这一章最重要的一个问题了,当时大一下学期学的时候没弄懂,一年后现在算是明白了. 首先,讲讲思路. 正好这学期在学算法,这里面就用到了贪心算法,刚好练练 ...