设计标签管理系统
需求
设计标签管理系统,支持:
- 标签全生命周期管理(创建→审核→上线→下线)
- 自定义规则标签 + 算法标签
- 人群圈选与导出
- 标签质量监控
架构设计
核心模块
| 模块 | 功能 | 技术方案 |
|---|---|---|
| 标签管理 | 创建、审核、上下线 | Web 平台 + 审批流 |
| 规则引擎 | 规则标签定义 | SQL DSL + 条件组合 |
| 标签计算 | 离线/实时标签加工 | Spark + Flink |
| 标签存储 | 标签结果存储 | HBase(离线) + Redis(实时) |
| 人群圈选 | 多标签组合筛选 | Bitmap + ClickHouse |
| 标签质量 | 覆盖率/稳定性监控 | 定时巡检 |
标签分类体系
| 标签类型 | 定义方式 | 更新频率 | 示例 |
|---|---|---|---|
| 事实标签 | 直接取值 | T+1 / 实时 | 年龄、城市、最后登录 |
| 规则标签 | SQL 条件 | T+1 | 高价值用户、活跃用户 |
| 算法标签 | ML 模型 | 周 / 月 | 流失概率、兴趣偏好 |
规则标签 DSL 设计
-- 标签规则 DSL(配置化)
{
"tag_name": "high_value_user",
"tag_cn": "高价值用户",
"rule": {
"operator": "AND",
"conditions": [
{"field": "total_amount_30d", "op": ">=", "value": 1000},
{"field": "order_count_30d", "op": ">=", "value": 3},
{"field": "last_login_days", "op": "<=", "value": 7}
]
},
"schedule": "daily",
"owner": "growth_team"
}
规则引擎将 DSL 转换为 Spark SQL 执行:
-- 自动生成的 Spark SQL
INSERT OVERWRITE TABLE tag_result PARTITION (dt='2024-01-15', tag_id='high_value_user')
SELECT user_id, 1 AS tag_value
FROM user_profile
WHERE total_amount_30d >= 1000
AND order_count_30d >= 3
AND last_login_days <= 7;
人群圈选
人群圈选支持多标签交集 / 并集 / 差集组合:
-- 人群圈选示例:高价值 AND 活跃 AND NOT 已领优惠券
SELECT user_id
FROM tag_bitmap
WHERE has_tag('high_value_user')
AND has_tag('active_user')
AND NOT has_tag('coupon_received');
Bitmap 加速人群圈选
使用 Bitmap 存储标签结果,交集 / 并集 / 差集通过位运算实现,毫秒级完成千万级用户圈选:
- 交集:
bitmap_and(tag_a, tag_b) - 并集:
bitmap_or(tag_a, tag_b) - 差集:
bitmap_andnot(tag_a, tag_b)
标签质量监控
| 监控维度 | 说明 | 告警阈值 |
|---|---|---|
| 覆盖率 | 标签非空用户 / 总用户 | 突降 > 20% |
| 稳定性 | 相邻两天标签值变化率 | 波动 > 30% |
| 时效性 | 标签计算完成时间 | 超过预期 2 小时 |
| 唯一性 | 互斥标签不能同时为真 | 冲突 > 0 |
常见面试问题
Q1: 标签系统和用户画像系统的关系?
答案:
- 标签系统:基础设施层,管理标签元数据、计算和存储
- 用户画像系统:应用层,基于标签系统提供可视化画像、人群圈选、洞察
标签系统是用户画像的底座,画像系统在标签之上叠加了应用层能力(圈选、分析、推送)。
Q2: 实时标签和离线标签如何统一查询?
答案:
采用 Lambda 架构:
- 离线标签:Spark 每天 T+1 计算,存 HBase
- 实时标签:Flink 实时计算,存 Redis
- 统一查询层:先查 Redis(实时),Miss 再查 HBase(离线),合并返回
Q3: 如何评估一个标签的价值?
答案:
| 维度 | 评估方法 |
|---|---|
| 使用频率 | 被下游系统调用次数 |
| 区分度 | 标签值分布是否均匀(偏斜严重则区分度低) |
| 业务价值 | 在圈选、推荐中的 ROI 提升 |
| 质量 | 覆盖率、准确率、稳定性 |
低使用、低区分度的标签应定期清理下线。