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

需求

项目组的电商系统运行了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. 关于js参数传递矛盾新理解

    之前看了很多人的解释,说js中,函数的参数传递都是值传递中不理解. 他们无非举了两个例子 在这两个例子中,第二个例子可以看出参数是由值传递的.因为函数内对象的变化没有影响到函数外对象的变化.但是在第一 ...

  2. unity3d 中文乱码解决方法——cs代码文件格式批量转化UTF8

    在Unity3d中经常会碰到中文乱码的问题,比如代码中的[AddComponentMenu("GameDef/AI/战机AI")],注释,中文文本等等 其原因在于,unity本身是 ...

  3. Appium 解决锁屏截屏问题(java篇)

    今天有个小伙伴问我,怎么把锁屏进行解锁操作?   A.思路在初始化driver后,加入等待判断是否有锁屏(元素)(记得要加入等待) B.如果有就进行解锁,就一般的输入数字密码然后进行解锁(当然了你要知 ...

  4. HTML的语义化,你需要深入了解

    有关HTML的一些基础课程,很多网站都有讲,于我而言,真正实践起来,我只要求我能够让它表现出我所想要的结果即可.然而,这种要求,对于后期的维护与测试,真的是......想起日前我们所做的这个项目,那里 ...

  5. AtCoder Beginner Contest 055题解

    A.当a=1就把a改成14,b=1就把b改成14,然后比较a,b大小即可. #include <iostream> #include <algorithm> #include ...

  6. XJOI1571爱心蜗牛【树形动规】

    爱心蜗牛 猫猫把嘴伸进池子里,正准备"吸"鱼吃,却听到门铃响了.猫猫擦了擦脸上的水,打开门一看,那人正是她的好朋友--川川.川川手里拿着一辆玩具汽车,对猫猫说:"这是我的 ...

  7. 老李分享:android手机测试之适配(1)

    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...

  8. 老李分享:为何要使用 Web Services

    老李分享:为何要使用 Web Services   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询q ...

  9. Java基础学习(三)—面向对象(上)

    一.理解面向对象       面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是 ...

  10. children 和childNodes 的区别

    1:childNodes /children相同点:它返回指定元素的子元素集合. 2:区别:children :  它是非标准的,仅返回HTML节点.甚至不返回文本节点.所有浏览器表现一 致. chi ...