如何开发打点统计系统

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

最近做了一个打点统计系统,统计系统肯定各个公司都有做过,至于怎么做就不好说了。我见过最多的就是使用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。至少能扛过一阵了。





本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/3773196.html,如需转载请自行联系原作者

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
pip镜像源大全及配置
在中国使用pip时,可以配置国内镜像源来提高安装速度和稳定性。以下是一些常见的国内镜像源:
19191 0
|
Linux 数据安全/隐私保护 Windows
更换(Pypi)pip源到国内镜像
pip国内的一些镜像 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.
247686 2
|
图形学
unity3d置灰image图片shader
新建材质球,赋值该shader,将材质球复制到image上即可置灰image Shader "UIEffect/ImageGray" { Properties { [PerRendererData] _MainTex("...
1706 0
|
存储 缓存 JavaScript
不要过度封装!封装一个最简单的Axios!
前言 axios 是目前最优秀的 HTTP 请求库之一,虽然 axios 已经封装的非常好了,我们可以直接拿过来用。但是在实际的项目中,我们可能还需要对 axios 在封装一下,以便我们更好的管理项目和各个借口。 但是,目前网上有特别多的针对于 axios 在项目中的封装。不得不说,很多大佬封装得非常全面,方方面面都考虑到了。但是我们的每个真的都需要那些封装吗?显然不是的,网上的很多封装其实都显得有点过度封装了! 本篇文章实现最简单 Axios 封装,让小伙伴们扩展起来容易一些。
5903 0
不要过度封装!封装一个最简单的Axios!
|
SQL 分布式计算 Hadoop
|
6月前
|
开发者
《HarmonyOSNext自动续期订阅支付全攻略 | 从环境检测到防漏单指南》
本文详解HarmonyOS Next自动续期订阅支付全流程,涵盖环境检测、商品展示、订单处理与防漏单策略,适用于教育科普行业开发者学习参考。
120 5
|
JavaScript 前端开发 开发工具
Flutter&鸿蒙next 中如何实现 WebView【跳、显、适、反】等一些基础问题
在 Flutter 项目中集成 WebView 可以展示网页或进行在线操作。本文介绍了如何添加依赖、配置平台权限、创建 WebView 页面、适配不同机型、处理页面间参数传递等详细步骤,帮助开发者高效实现 WebView 功能,提升用户体验。
669 4
|
前端开发 JavaScript
论如何用Vue实现一个弹窗-一个简单的组件实现
最近在使用element-ui框架,用到了Dialog对话框组件,大致实现的效果,跟我之前自己在移动端项目里面弄的一个弹窗组件差不太多。然后就想着把这种弹窗组件的实现方式与大家分享一下,下面本文会带着大家手摸手实现一个弹窗组件。 本文主要内容会涉及到弹窗遮罩的实现,slot插槽的使用方式,props、$emit传参,具体组件代码也传上去了。如果喜欢的话可以点波赞/关注,支持一下,希望大家看完本文可以有所收获。
2828 0
论如何用Vue实现一个弹窗-一个简单的组件实现
|
前端开发 JavaScript Java
springboot酒店管理系统分前后端【源码+数据库】
springboot酒店管理系统分前后端【源码+数据库】
342 0
|
SQL 分布式计算 分布式数据库
Hive命令大全
Hive命令大全
372 2

热门文章

最新文章