一、需求
需求是要能统计作品在各个渠道投放时的转化率。这个需求很重要,没有它,无法实现业务闭环,就无法跑通业务。
注: 应用场景 - RPA大赛,需分渠道。
二、为何自研
要实现这个功能,就需要自定义事件统计。普通的 pv 统计,是无法满足要求的。
- 支持自定义事件统计;
- 支持 Open API(提供给H5端和后台管理端) —- 重要;
市场上第三方的统计服务:如友盟、百度统计、arms,经调研发现,要么收费很贵(百度统计一年好几万),调研结果如下:
- 百度统计,免费的不可用,需要开通一个付费服务,每年3万左右,价格太贵;
- 友盟,web统计不支持自定义事件和 Open API;
- 腾讯移动分析,支持自定义事件上报,但 Open API 里没有提到自定义事件;
- 阿里ARMS,不支持自定义事件的 Open API 获取;
所以选择自研一个,包括:
- 日志收集;
- 日志分析;
- OpenAPI;
三、自研统计服务 EAS
自定义事件统计,是一个线上产品必备的统计功能。EAS(Event Analytics Server) 事件统计服务 —— 为了实现分渠道统计。
核心功能点
- nginx 收集统计日志;
- 日志收集、拆分和定时清理;
- 分析日志,得到统计结果;
- 提供 OpenAPI 服务;
注意事项
- 像这种比较专业的服务,尽量使用靠谱的第三方(哪怕花点钱),自研是下策;
- 要做的是一个能满足大众需求的自定义事件统计服务,而不仅仅是为分渠道统计服务的 —— 具备通用性和扩展性;
四、技术方案设计
4.1 需求分析
多渠道
渠道就是一个url参数,如 http://127.0.0.1:3002/p/100-xxx?channel=1
(注:100是作品id,xxx是uuid,channel就是渠道号)。一个作品可以对应多个渠道,至少要有一个渠道。
从技术角度,一个作品就是一个资源实体一个url,渠道仅仅是一个参数。但从用户使用角度来看,一个作品就可以发布多个页面,多个二维码。
4.2 主要流程
- 分析日志结果是个离线操作。离线操作可理解为每天凌晨定时分析前一天的日志,然后将分析结果落到数据库中。
4.3 如何实现
4.3.1 Nginx 收集日志
Nginx 提供一个 web server
,返回一个小图片,如 http://localhost:8083/event.png
。
- 简单,无论是 server 还是 h5
- 没有跨域
- 小图片,小流量
Nginx 收到访问请求时会自动记录 access_log
。
127.0.0.1 - - [19/Feb/2021:15:21:33 +0800] "GET /event.png HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" "-"
127.0.0.1 - - [19/Feb/2021:15:21:46 +0800] "GET /event.png?a=100 HTTP/1.1" 200 5233 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" "-"
127.0.0.1 - - [19/Feb/2021:15:21:47 +0800] "GET /event.png?a=100 HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" "-"
127.0.0.1 - - [19/Feb/2021:15:22:00 +0800] "GET /event.png?a=100 HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" "-"
127.0.0.1 - - [19/Feb/2021:15:22:06 +0800] "GET /event.png?a=100&b=200 HTTP/1.1" 200 5233 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36" "-"
4.3.2 定时任务
定时任务主要做以下几件事情:
- 定时拆分 access_log ,视流量大小,可以按天、小时、分钟来拆分;
- 定时分析计算日志结果,例如每天凌晨 4:00 ,分析昨天的日志;
- 定时清理历史日志文件
实现方案:
- linux 自带的 crontab 定时任务
- npm 插件 node-cron 或 node-schedule(注:采用该方案)
4.3.4 Open API
OpenAPI 用 nodejs 服务即可
4.4 安全与运维
4.4.1 日志服务对硬盘要求高
- 购买服务器时,多考虑硬盘空间
- 运维监控时,考虑硬盘监控(如达到 80% 报警) —— ali-node 有这个功能
- 及时清理历史日志
4.4.2 安全
- OpenAPI 设置 CORS ,只允许特定的 host 访问。
- 日志收集,可能会被恶意灌入数据,这些靠阿里云防火墙。