跳转到内容

Scenario 20: Analytics Platform 数据分析平台

你想做一个数据Dashboard原型,展示一些业务指标图表。

  • 硬编码JSON数据作为数据源
  • Chart.js画折线图、柱状图、饼图
  • 维度筛选(时间范围、分类)
  • 响应式布局,多图表排列

用HTML+CSS+JS+Chart.js做一个数据分析Dashboard。数据硬编码在JS中(模拟7天的PV/UV、 各渠道转化率、用户设备分布)。包含:折线图(日PV/UV趋势)、柱状图(渠道对比)、 饼图(设备分布)。支持日期范围筛选(近7天/30天切换,用不同的硬编码数据)。 网格布局,卡片式图表,顶部显示关键指标数字(总PV、总UV、平均转化率)。

  • 三种图表正确渲染
  • 日期范围切换后数据和图表更新
  • 关键指标数字显示正确
  • 移动端布局自适应
  • Chart.js图表库使用 → Module: 数据可视化
  • 数据筛选与UI联动 → Module: 前端状态管理
  • 响应式网格布局 → Module: CSS Grid

V2 — 10人用:数据采集+简单聚合

Section titled “V2 — 10人用:数据采集+简单聚合”

需要真实采集用户行为数据,不再用硬编码。

  • 打点数据采集API(POST /track)
  • 事件数据存JSON文件(按天一个文件)
  • 简单聚合API(按天统计PV/UV)
  • JS SDK一行代码接入打点

Go+Gin后端。POST /api/track 接收事件数据(event_name, properties, user_id, timestamp), 追加写入 data/events/2024-01-15.json(按天分文件,每行一个JSON)。 GET /api/stats/daily?start=2024-01-01&end=2024-01-15 读取文件,聚合每天的事件数、 独立用户数。GET /api/stats/events 返回各事件名的计数排行。 写一个极简JS SDK:analytics.track(“page_view”, {page: “/home”}),自动带上user_id和时间。

  • 打点数据正确写入按天文件
  • 聚合API返回正确的日统计
  • JS SDK调用简单,自动补全字段
  • 文件并发写入不丢数据(文件锁)
  • 事件采集设计 → Module: 数据埋点
  • JSON Lines文件格式 → Module: 数据存储格式
  • 文件并发写入 → Module: 并发控制

数据量增大,文件聚合太慢,需要数据库和预聚合。

  • PostgreSQL存储事件,按天分区
  • 预聚合表:每小时/每天的指标自动计算
  • 定时聚合任务(每小时跑一次)
  • Dashboard页面:多维度图表+实时数据

迁移到PostgreSQL。事件表按created_at按月分区(PostgreSQL声明式分区)。 创建预聚合表 daily_stats(date, event_name, count, unique_users)和 hourly_stats(hour, event_name, count)。Go定时任务每小时聚合上一小时数据 插入预聚合表。Dashboard API从预聚合表读取,响应时间<50ms。 前端Dashboard用React+Chart.js,支持:日趋势、事件排行、用户留存表格。

  • 分区表创建正确,查询走分区裁剪
  • 预聚合定时任务按时执行
  • Dashboard加载<1秒
  • 支持至少3种图表维度
  • 数据库分区 → Module: PostgreSQL高级
  • 预聚合模式 → Module: OLAP基础
  • 定时任务 → Module: 后台调度

V4 — 1000人用:实时计数+漏斗分析

Section titled “V4 — 1000人用:实时计数+漏斗分析”

产品经理需要实时数据和转化漏斗分析。

  • Redis存储实时计数(当前在线、今日PV)
  • 定时任务将Redis计数同步到DB
  • 漏斗分析:定义步骤序列,计算每步转化率
  • 数据导出功能

Redis实时计数:每次事件 INCR day:{date}:pv,PFADD day:{date}:uv {user_id}(HyperLogLog)。 实时API从Redis读,延迟<10ms。每5分钟定时任务将Redis计数快照写入DB。 漏斗分析API:POST /api/funnel,body指定步骤序列(如[“visit”,“add_cart”,“pay”]), 查询每步的用户数和转化率。用窗口期7天内完成算转化。 数据导出:GET /api/export/events?date=2024-01-15 导出CSV文件。

  • 实时PV/UV数据秒级更新
  • HyperLogLog UV误差<2%
  • 漏斗转化率计算正确
  • CSV导出格式规范,大数据量不OOM
  • Redis计数器模式 → Module: Redis应用
  • HyperLogLog → Module: 概率数据结构
  • 漏斗分析算法 → Module: 产品分析

V5 — 1万人用:列式存储+即席查询

Section titled “V5 — 1万人用:列式存储+即席查询”

事件量达亿级,PostgreSQL查询太慢,需要OLAP引擎。

  • ClickHouse列式存储应对海量事件
  • SQL即席查询界面(用户自己写SQL)
  • 留存分析(N日留存曲线)
  • 数据导入管道(PostgreSQL → ClickHouse)

部署ClickHouse,创建事件表(MergeTree引擎,按日期分区,按event_name排序)。 数据管道:PostgreSQL事件表每小时增量同步到ClickHouse。 即席查询API:POST /api/query,接收SQL(限制只能SELECT,加LIMIT 1000), 返回结果+执行耗时。前端SQL编辑器(Monaco Editor),表格展示结果。 留存分析:计算注册后第1/3/7/14/30天的回访率,用热力图展示。

  • 亿级数据查询<3秒
  • SQL注入防护(只允许SELECT)
  • 留存热力图数据正确
  • 数据管道增量同步无遗漏
  • 列式存储原理 → Module: ClickHouse
  • OLAP vs OLTP → Module: 数据库选型
  • 留存分析 → Module: 用户生命周期

全公司统一数据平台,支持实时+离线+自助分析。

  • Kafka统一数据收集入口
  • Flink流处理实时指标
  • 数据湖存储原始数据(长期保留)
  • 自助分析:拖拽式报表生成器

数据收集统一走Kafka(topic: raw-events)。Flink消费Kafka: 1)实时聚合写入Redis(实时Dashboard)2)清洗后写入ClickHouse(即席查询) 3)原始数据写入对象存储/数据湖(Parquet格式,按天分目录)。 自助分析:可视化查询构建器,用户选择指标+维度+筛选条件, 自动生成SQL发到ClickHouse。支持保存报表、定时邮件发送。 数据血缘:记录每个指标的计算逻辑和数据来源。

  • Kafka→Flink→多端输出链路通畅
  • 实时指标延迟<30秒
  • 自助查询构建器生成正确SQL
  • 数据湖Parquet文件可被Spark读取
  • 历史数据可回溯至少90天
  • 流批一体架构 → Module: Flink
  • 数据湖 → Module: 数据平台架构
  • 自助分析 → Module: BI工具设计