背景
用户分组是根据某些属性将乘客、司机等划分为不同群体的过程,在Grab内部这个系统被用于营销活动、ABTest等场景
系统架构
子系统
分组创建
调度离线的Spark任务,从数仓召回用户集合后清洗加工,写入分组字段
分组服务
同步分组到NoSQL数据库
检索用户所属分组
存在的问题
- 分组创建时间长
- 分组读取延迟
- 存储成本
优化方案
基于bitmap的分组存储
Grab的解决思路是优化分组写入速度,将原本的数据库多行写入改为创建一个bitmap,bitmap优化写入速度的同时带来几个新的问题:
- 稀疏的用户分组(e.g. 在两亿用户中圈定几百人)
- 检索服务延时增加
对于稀疏分组,Grab进一步改进使用Roaring Bitmaps(一种压缩bitmap);牺牲的检索速度,只能通过进入缓存来优化
最后的问题
如果用户ID系统使用类似UUID的方案设计,Grab的用户分组还可以这么设计吗?