zoukankan      html  css  js  c++  java
  • 如何开发打点统计系统

    最近做了一个打点统计系统,统计系统肯定各个公司都有做过,至于怎么做就不好说了。我见过最多的就是使用php开发一个打点接口,然后在打点接口中做数据点击,这种方法最差的就是每次打点都往数据库中操作,另外一种就是往一个文件中增加数据。对于后一种,我就很奇怪了,你既然php是等于要往日志文件中增加一条记录,那干啥不用web服务器的自身的日志呢?所以我这次就果断使用分析nginx日志的方法来做打点(这个方法也是大多公司统计系统采用的方法吧)。
    至于storm,hadoop啥的,太高大上了。没用

    nginx日志打点第一个使用什么打点接口,当然可以自己放一个文件在服务器,然后访问这个文件。但是实际上nginx有个empty_gif的模块,它把图片存放在nginx的内存中,所以它的访问速度比静态文件的访问速度还快,所以果断选择这个。因此我的配置文件如下:

    server {
            listen       80;
            server_name ares.test.com;
            access_log /home/web/ares/log/ares.test.com.access.log;
            access_log /home/web/ares/log/ares.test.com.static.log;
            error_log /home/web/ares/log/ares.test.com.error.log notice;
    
            root /home/web/test/www/;
            index index.php;
    
            location = /ares.gif {
                empty_gif;
            }
    }

    这里我把access_log写两份,目的是希望我一份做存留,一份做分析。

    我设计的访问接口是http://ares.test.com/ares.gif?p=a&i=b

    这里的p和i是统计的项目和统计项。

    然后日志写完了之后,就需要进行日志切割了,日志切割怎么搞都行,我就搬起了php最快上搞,就是这里要注意下切割完日志以后要给nginx发送一个信号,让它修改下日志的fd。

           @rename($srcLog, $disLog);
    
            // 发送信号给nginx
            $pidFile = Yii::app()->params->nginxPid;
            $command = "kill -USR1 `cat ${pidFile}`";
    
            @system($command);

    然后这个脚本我设置每1分钟跑一次,将当前的日志用分钟来重命名

    下面就是分析日志的过程。

    分析日志一定会是多个进程的环境。为什么,因为,一个进程,太慢。那多进程的环境,就需要有多个进程同时读取一个文件的情况,分析日志的时候就需要注意下使用文件锁。

                $disLogs = glob(Yii::app()->params->logFolder . "ares_*.log");
    
                foreach ($disLogs as $log) {
                    $fp = fopen ($log , "rw+");
    
                    // 如果获取到锁
                    if (flock($fp , LOCK_EX)) {
                        while(!feof($fp)) {
                            $line = fgets($fp, 4096);
                            // DO SOMETHING
                        }
    
                        ftruncate($fp, 0);
                        fflush($fp);
                        flock($fp, LOCK_UN);
                        unlink($log);
    
                        echo "logfile {$log} ok" . PHP_EOL;
                    }
    
                    fclose ($fp);
                }

    然后这个脚本我会让它循环跑10分钟,每2分钟启动一个脚本,这样就有5个脚本在跑。

    至于数据库设计,就和后台需求有关了。

    我这里第一版最简单的就是记录下每个小时的点击数。

    所以只需要最简单的项目表,统计项表,统计数据表就好。

    这样子还有个好处就是可分布式扩展,如果一个统计前端机扛不住了,那么我就单纯加机器就好了,反正这些数据都是往同一个数据库中插入的。

    至于后台界面开发,最近疯狂喜欢上ACE这套后台模板,然后画图使用HighChart来弄。

    后台统计项目如何加功能后面后面再说~

    至此初步的统计就搞起来了。我在一台机器上测试过前端压力,8核的机器,大概能有1w左右的qps。至少能扛过一阵了。

  • 相关阅读:
    源码阅读(18):Java中主要的Map结构——HashMap容器(中)
    源码阅读(17):红黑树在Java中的实现和应用
    java中创建文件并写入的方法
    源码阅读(16):Java中主要的Map结构——HashMap容器(上)
    源码阅读(15):Java中主要的Map结构——概述
    从源码分析:Java中的AQS
    源码阅读(14):Java中主要的Queue、Deque结构——PriorityQueue集合(下)
    源码阅读(13):Java中主要的Queue、Deque结构——PriorityQueue集合(中)
    java 归并排序与快速排序
    python中的容器、可迭代对象、迭代器、生成器
  • 原文地址:https://www.cnblogs.com/yjf512/p/3773196.html
Copyright © 2011-2022 走看看