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

需求

项目组的电商系统运行了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. h5 做app时和原生交互的小常识。

    距离上次随笔或许有半年了吧,最近在用hybrid模式开发移动app,所以就简单的说说用h5技术开发app时候,做原生交互的几个小常识: 一.拨打电话或者发送短信: <a href="t ...

  2. C# Task 源代码(2)

    上篇已经讲到Task 的默认的TaskScheduler 为ThreadPoolTaskScheduler. 这时我们回到原来的task 的start方法,在代码最后,调用了 ScheduleAndS ...

  3. hdu 1757 A Simple Math Problem (构造矩阵解决递推式问题)

    题意:有一个递推式f(x) 当 x < 10    f(x) = x.当 x >= 10  f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + ...

  4. Android中的java层的线程暂停和恢复实现

    /**  * 基础线程对象.  *  * @author jevan  * @version (1.0 at 2013-6-17)  * @version (1.1 at 2013-7-2) 增加on ...

  5. 告别S! S! H!秒杀终端工具——FastLogin快捷登录

    题记:自从接触到"跳板机"的概念后,一直就被烦不胜烦的机器名,ip地址,用户名,密码折腾的死去活来,心说能有个小精灵随时帮我输入那些重复的登录信息就好了.我见过最挫的方式就是用记事 ...

  6. 学习MVC之租房网站(二)-框架搭建及准备工作

    在上一篇<学习MVC之租房网站(一)-项目概况>中,确定了UI+Service的“双层”架构,并据此建立了项目 接下来要编写Common类库.配置AdminWeb和FrontWeb 一.编 ...

  7. C语言函数不定参数实现方式

    函数如何实现不定参数: 由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,提出了指针参数来解决问题. (1)va_ ...

  8. Android Weekly Notes Issue #253

    Android Weekly Issue #253 April 16th, 2017 Android Weely Issue #253. 本期内容包括: Android O新推出的自定义字体支持; 用 ...

  9. 【转】JDBC学习笔记(6)——获取自动生成的主键值&处理Blob&数据库事务处理

    转自:http://www.cnblogs.com/ysw-go/ 获取数据库自动生成的主键 我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. ...

  10. 机器学习笔记-1 Linear Regression with Multiple Variables(week 2)

    1. Multiple Features note:X0 is equal to 1 2. Feature Scaling Idea: make sure features are on a simi ...