埋点系统设计方案总纲
项目背景
为了更好地了解用户行为,提升产品体验和业务决策,我们需要建立一套完整的埋点数据收集和分析系统。该系统需要支持多平台(iOS、Android、H5),具备实时数据上报、批量处理、数据去重、敏感信息脱敏等核心功能。
核心需求分析
1. 上报时机要求
- 实时上报:用户触发事件(如点击、提交)立即上报,确保关键行为数据不丢失
- 批量上报:非实时性事件(如页面停留时长、播放进度)在适当时机批量上报,减少网络请求压力
- 崩溃数据优先上报:应用崩溃时的关键数据必须优先确保上报成功
2. 字段规范要求
所有埋点事件必须包含以下核心字段:
user_id:用户ID,未登录时使用设备ID替代device_id:设备唯一标识,必填timestamp:事件发生时间戳,精确到毫秒,必填app_version:应用版本号,必填system_version:系统版本,必填network_type:网络类型(wifi/4g/3g/2g/unknown),必填
3. 去重机制要求
- 同一事件在10秒内重复触发,仅上报一次
- 通过事件名+关键属性组合生成唯一标识进行去重
- 避免因用户误操作或页面刷新导致的数据冗余
4. 安全合规要求
- 敏感信息(手机号、身份证号、评论内容等)必须脱敏处理
- 禁止明文传输敏感数据
- 支持配置化的脱敏规则
系统架构设计
整体架构图
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ iOS App │ │ Android App │ │ H5 App │
│ (Obj-C SDK) │ │ (Java SDK) │ │ (JS SDK) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
└───────────────────────┼───────────────────────┘
│
┌─────────────────┐
│ 埋点数据服务 │
│ (Java Spring) │
└─────────────────┘
│
┌─────────────────┐
│ 管理后台 │
│ (Vue 3) │
└─────────────────┘
技术栈选型
- 服务端:Java Spring Boot + MongoDB + Redis
- 管理后台:Vue 3 + TypeScript + Element Plus
- 数据存储:MongoDB(埋点数据)+ PostgreSQL(配置数据)
- 缓存服务:Redis(数据缓存、去重校验)
- 消息队列:可选,用于高峰期数据缓冲
数据模型设计
核心数据结构
埋点事件数据模型
{
// 核心必填字段
user_id: "user_123", // 用户ID,未登录时用device_id
device_id: "device_abc123", // 设备ID,必填
timestamp: 1640995200000, // 时间戳,毫秒级,必填
app_version: "1.0.0", // APP版本,必填
system_version: "iOS 15.1", // 系统版本,必填
network_type: "wifi", // 网络类型,必填
// 事件信息
event_name: "button_click", // 事件名称
event_type: "realtime", // 事件类型:realtime/batch/crash
properties: { // 事件属性(已脱敏)
button_name: "login",
page_name: "home",
phone: "138****1234", // 脱敏后的手机号
comment: "***违规内容***" // 脱敏后的评论
},
// 设备信息
platform: "ios", // 平台:ios/android/h5
device_info: {
model: "iPhone12",
manufacturer: "Apple",
screen_width: 375,
screen_height: 812
},
// 系统字段
create_time: ISODate(), // 数据入库时间
ip_address: "192.168.1.1", // 客户端IP
user_agent: "Mozilla/5.0..." // User-Agent
}
事件配置模型
{
event_name: "button_click", // 事件名称
display_name: "按钮点击", // 显示名称
description: "用户点击按钮事件", // 描述
properties: [ // 属性定义
{
name: "button_name",
type: "string",
required: true,
description: "按钮名称"
},
{
name: "page_name",
type: "string",
required: false,
description: "页面名称"
}
],
desensitize_rules: [ // 脱敏规则
{
field: "phone",
method: "desensitize_phone"
}
],
status: 1, // 状态:1启用 0禁用
create_time: ISODate(),
update_time: ISODate()
}
上报策略设计
1. 实时上报 (Real-time Reporting)
- 适用场景:用户交互事件(点击、提交、切换等)
- 上报时机:事件触发后立即上报
- 网络要求:需要网络连接,无网络时缓存等待
- 数据量:单条数据上报
2. 批量上报 (Batch Reporting)
- 适用场景:非实时性数据(页面停留、播放进度、滑动轨迹等)
- 上报时机:
- 页面离开时(beforeunload事件)
- 应用切换到后台时
- 批量数据达到阈值时(数量/时间)
- 网络恢复时
- 数据量:多条数据批量上报
3. 崩溃数据优先上报 (Crash Priority Reporting)
- 触发条件:应用崩溃、JavaScript错误、未捕获的Promise错误
- 上报机制:
- 同步上报,确保在应用退出前完成
- 本地持久化,确保上报失败时不丢失
- 高优先级网络请求
- 数据内容:错误信息、堆栈信息、设备状态等
核心功能模块
1. 数据采集SDK
提供统一的数据采集接口,支持多平台:
- 事件跟踪:track(eventName, properties)
- 用户管理:setUserId(), setUserProperties()
- 设备信息:自动采集设备和系统信息
- 网络状态:实时监测网络变化
- 数据缓存:离线数据本地缓存
2. 数据处理服务
- 数据接收:HTTP接口接收埋点数据
- 数据验证:格式校验、必填字段检查
- 数据清洗:去重处理、数据标准化
- 敏感脱敏:根据配置规则脱敏敏感信息
- 数据存储:分库分表存储海量数据
3. 管理后台系统
- 事件管理:配置埋点事件和属性
- 脱敏配置:设置敏感数据脱敏规则
- 数据查询:多维度数据检索和统计
- 监控告警:系统状态监控和异常告警
去重机制设计
去重策略
- 时间窗口去重:10秒内相同事件仅上报一次
- 属性组合去重:基于事件名+关键属性生成唯一标识
- 设备维度去重:同一设备在时间窗口内的重复事件
去重算法
class EventDeduplicator {
// 使用Redis存储去重标识,设置10秒过期
async shouldReport(eventKey: string): Promise<boolean> {
const exists = await redis.exists(`buried_point:${eventKey}`);
if (!exists) {
await redis.setex(`buried_point:${eventKey}`, 10, '1');
return true;
}
return false;
}
generateEventKey(eventName: string, properties: any, deviceId: string): string {
// 提取关键属性生成key
const keyProps = this.getKeyProperties(eventName);
const values = keyProps.map(prop => properties[prop] || '').join('|');
return `${deviceId}:${eventName}:${values}`;
}
}
安全与合规设计
敏感数据处理
- 手机号脱敏:13812345678 → 138****5678
- 身份证脱敏:440123199001011234 → 4****************1
- 评论内容脱敏:自动识别敏感词并替换为***
- 配置化脱敏:支持动态配置脱敏规则
数据传输安全
- HTTPS加密传输
- 数据压缩减少传输量
- 请求频率限制防止恶意调用
- IP白名单和API密钥认证
性能优化策略
1. 数据压缩
- 使用GZIP压缩传输数据
- 批量上报减少请求次数
- 数据格式优化减小体积
2. 缓存策略
- 本地缓存未上报数据
- Redis缓存热点配置
- CDN加速静态资源
3. 高可用设计
- 服务多实例部署
- 数据库读写分离
- 消息队列异步处理
- 监控和自动扩容
监控和运维
系统监控指标
- 数据采集监控:上报成功率、延迟时间、数据完整性
- 服务性能监控:响应时间、吞吐量、错误率
- 数据质量监控:数据准确性、完整性、及时性
- 业务指标监控:关键事件转化率、用户活跃度
告警机制
- 数据上报异常告警
- 服务可用性告警
- 数据质量问题告警
- 业务指标异常告警
实施计划
第一阶段:核心功能开发
- 设计数据模型和API接口
- 实现服务端数据接收和处理
- 开发管理后台基础功能
- 建立监控和告警体系
第二阶段:SDK开发
- iOS Objective-C SDK开发
- Android Java SDK开发
- H5 JavaScript SDK开发
- 各平台集成测试
第三阶段:优化完善
- 性能优化和压力测试
- 数据分析功能扩展
- 安全加固和合规检查
- 上线部署和运维
总结
本埋点系统设计方案充分考虑了多平台支持、数据安全性、系统性能和可维护性等方面的要求。通过分层架构设计,确保了系统的可扩展性和高可用性。实时上报、批量上报和崩溃数据优先上报相结合,保证了数据的完整性和及时性。内置的去重机制和敏感数据脱敏功能,确保了数据的质量和合规性。
后续将分别实现各平台的SDK,并进行详细的技术文档编写。