一个数据统计的项目总结
不知道这个URL的拼写是不是对的,我想表达的是【一个类google analytics项目的总结】,呃,错了也就这样吧
先得说一下为什么没有使用 Google Analytics
该项目本身是一个广告投放系统,所以有广告的显示点击相关的统计项,这个是GA不可能有的
而在统计广告主网站的流量来源时,希望能够统计出来自广告的来源,于是,GA就不能用了
或者是,它提供了这个功能,但是我们不了解,于是自费工夫重复发明轮子
————其实是我接手此项目的时候,数据库都设计好了。。。
这个分析系统是用Java写的,一共有170个java文件,不包括我提取出来的公用基础代码。涉及的数据库表,只读的表10张,读写的表44张。
自觉不算小系统了,对于一个人来说
系统采取的框架很简单:Spring+ibatis,数据存储有一部分用了lucene,绝大部分数据还是放在mysql里
spring用了几年了,没什么问题,ibatis和lucene都是第一次使用,纯粹的现学现用。
所以一开始我的ibatis写的相当一般,在我写到后面时回顾都有明显的感觉:前面真恶。。
不过谁都是这么学习过来的。在这里我回想起以前有一次面试,因为自己没有ibatis的使用经验而被鄙视的。现在就觉得那人是看我不爽而变相的打压我而已了。
系统进行统计时的原始数据是 nginx 的 access 访问日志,nginx的服务器有可能做了负载均衡,也就是多台机器,因此另有一个 LogUploader 程序分布在几台机器上,这些程序通过 cron 定时启动,将【增量日志】传送至分析机器
增量日志的处理方法,我是让 cron 在每个 10 分钟的后 1 分钟启动,然后用 grep 每次取前 10 分钟的数据出来
日志传送用了最原始的 scp
做的时候被提示数据量可能巨大,每日超过数千万,于是,我把很多本最好分开的处理过程放在一个地方处理了
具体是这样的:做一个类型的统计,就得 iterate 一遍数据列表,既然数据量大,那就为了性能放弃独立性吧,在一次的 iterate 过程中做掉所有统计
在写完系统的现在,这个项目如果再来一遍的话,我不会选择放弃独立性,当时做选择时,我并没有太多的时间及资源对系统进行全面的认知
我是有对自己说【在性能成为问题之前都不是问题】的,只不过当时也是刚刚进公司,于是我选择了沉默并接受他人的看法
这类统计有一些是每天需要进行一次的,比如说网站的每日访客数,以及其它的诸项统计
这里面有我没做好的:当系统对某个时间的某种统计出现错误时,系统应该预留好接口可以简单的进行重新统计
最简单的办法是可以通过命令行简单的调用,便能对某日的指定统计重做
如果说对此项目有点遗憾的话,就是这个了,在系统后期我重写了某个统计项的所有代码,让它做到了这一点,感觉就好很多
在项目前期,编码之前,被要求写设计文档。这当然是少不了的,于是用 rst 风格写了一个文档,大体上写了处理思路。
结果是反复的被批判,说不够详细,要重写重写。
以下省略若干字。。。。。
我重写了大概两三遍,了解我的朋友估计会对我重写两三遍感到很惊奇:我这样的人居然会重写两三遍文档???!!!
这事我是这么看的:自己的实际能力没有问题,但是表述能力相当不行,导致的结果,最明显的是,在面试的时候,体现不了自己的价值,于是要么直接被拒了,要么就是薪资不行。
呃
这篇日志既然是个项目总结,那再提点其它的吧。
网络广告,有两个最基本的统计项:显示量和点击量。显示量表示该广告被观看了多少次,点击量表示该广告被点击了多少次。
就目前为止,这个系统在生产线上的几次广告投放,媒体都不会让你埋显示代码。这是我第一次接触这些东西,一碰到这问题就明白了,尼玛要是人家把显示量告诉你了,那你就可以对它的流量进行一个精确的计算,然后继续分析此次投放值不值,对方的网站的价值是多少,下次再投是否可以砍价。
当然这是非常好理解的。
不过也有比较恶心的,就是媒体的统计数据和我方的统计数据天差地别。有些数据我方比对方多20~30%,还有些数据对方是几百而我方只有个位数。
产品运营人员在系统刚上线的时候就这个问题让我反反复复的查,我查了五六次都发现统计程序没问题,nginx的日志里也就这么些数据。。
再有嘛就是用户的UserAgent太他妈多了,上千种有木有啊!!!种类多没啥,重点是,很多不带cookie的,更有甚者,改写你设置的cookie的,如在cookie的value前后加上引号啊,引号进行URL编码又是换成22%啊,他又偏偏不用%22而是用x22啊,相当相当的令人头疼啊。
还有遇到最最最头疼的问题是在进行网站流量统计的时候,自己的PV数总比其它的三方统计少,而且少很多。这个问题我要另起一篇稍微详细点的写。
其它的暂时不写吧
总结的总结
- 设计文档必须得写,慢慢的去学会怎么在技术上吹牛逼
- 程序设计上应该预留一个现场重现的机制,在部分模块出错的时候,不至于重做全套
- 遇到问题的话多上网寻找帮助
| anyShare分享到: | |
| |