项目列表

项目记录 05 · 数据工程 · 网页行为分析

网页行为分析服务 VODA 的架构重新设计

采集点击与滚动 → 处理 SQS 消息 → 存入 Elasticsearch → 定期汇总 → 热力图与图表

PythonSeleniumDockerElasticsearchMySQLAWS SQS

通过预先汇总,解决了分析页面的超时问题

VODA 是一款分析服务,收集网站访客的页面浏览、点击和滚动,并以流量图表和热力图呈现。随着使用的网站增多,原有架构难以支撑,于是由 4 人组成的 TFT 重新设计了架构。我负责事件采集、消息处理、数据汇总和页面截图。

  • 5项亲自解决的采集与汇总问题
  • 4 个负责开发的组件
  • 4 人架构重新设计 TFT 的人数
鼠标移动热力图页面

将访客鼠标长时间停留的位置叠加显示在页面上。坐标采集和汇总为该页面生成数据。截图来自服务介绍资料,公司名称已遮挡。

本地化参考图 · 查看韩语原图
已分配角色
我修正了点击坐标的采集,并开发了将 SQS 消息转换为 Elasticsearch 文档的处理程序、预先生成汇总结果的数据整理器,以及截取整页的爬虫。
成果
我纠正了因设备不同而偏移的点击坐标,并防止了消息丢失和重复。分析页面不再每次都在 Elasticsearch 中汇总,而是读取数据整理器预先生成的结果,从而解决了超时问题。
  1. 1坐标采集以鼠标下方最上层元素为基准记录坐标
  2. 2消息处理将 SQS 消息加工为 Elasticsearch 文档格式
  3. 3数据整理器定期汇总并存入 RDS 表
  4. 4页面爬虫即使是整页滚动的网站也能截取整页

旧架构与新架构

原有
  1. Web Agent采集访客的页面浏览、点击和滚动

  2. voda-server由一台服务器将采集数据存入 MySQL,并负责整理和页面响应

  3. 分析界面流量图表和热力图

新架构我亲自开发的部分
  1. 采集

    • Web Agent采集访客的页面浏览、点击和滚动改进坐标记录方式
    • API Gateway, SQS将鼠标和滚动事件存放在队列中
    • pv-recorder, mouse-recorder将消息存为 Elasticsearch 文档消息加工、并行采集、去重
    • page-crawler采集页面截图和元素位置整页截图
  2. 存储

    • Elasticsearch事件日志和汇总结果
    • MySQL客户、页面信息、报告
  3. 整理

    • 汇总整理器定期汇总鼠标和滚动数据搭建数据整理器
    • forecast预测访问趋势
  4. 可视化

    • presenter向分析页面提供数据的 API返回汇总结果
    • voda-analytics面向管理员的分析界面

此技术预期带来的变更

不遗漏事件的采集

将采集器拆分到多个容器中,及时取走队列中堆积的消息;同一条消息即使到达两次,也只保留一条记录。

不受设备影响的准确热力图

以网页元素为基准记录坐标,即使屏幕尺寸不同,同一按钮的点击也会集中在同一位置。

无需等待的分析页面

繁重的汇总提前完成,管理员打开页面时即可看到图表和热力图,不会超时。

问题及解决方案

  1. 问题由于按页面绝对坐标记录,即使点击同一个按钮,也会因屏幕尺寸不同而记录到不同位置。

    已解决。找到鼠标下方最上层的网页元素,并以该元素内的坐标进行记录。

  2. 问题每次打开分析页面都用 Elasticsearch Aggregation 汇总,响应缓慢导致超时。

    已解决。新开发了定期汇总并存入 RDS 表的数据整理器,页面只需读取汇总结果。

  3. 问题政府机关网站常用按区块切换的整页滚动,普通截图只能截到第一个区块。

    已解决。不使用 Selenium API,而是直接向 Chrome 发送请求,将截图高度扩展到整个滚动长度,并以移动端方式截图。

  4. 问题如果 1 分钟内没有取走 SQS 消息,就会超出队列上限,导致数据丢失。

    已解决。通过异步任务队列把采集命令分发到多个 Docker 容器,让消息并行获取。

  5. 问题改为并行获取后,同一条消息会被取两次,导致日志重复。

    已解决。用消息时间和用户 ID 生成文档 ID,使相同的消息会被覆盖。

分析服务界面

用户数分析界面

显示按时段和星期的访问趋势及预测值。截图来自服务介绍资料,公司名称已遮挡。

本地化参考图 · 查看韩语原图