Grab如何设计用户分组系统

180 阅读1分钟

image.png

背景

用户分组是根据某些属性将乘客、司机等划分为不同群体的过程,在Grab内部这个系统被用于营销活动、ABTest等场景

系统架构

image.png

子系统

分组创建

调度离线的Spark任务,从数仓召回用户集合后清洗加工,写入分组字段

分组服务

同步分组到NoSQL数据库

检索用户所属分组

存在的问题

  • 分组创建时间长
  • 分组读取延迟
  • 存储成本

优化方案

基于bitmap的分组存储

image.png

Grab的解决思路是优化分组写入速度,将原本的数据库多行写入改为创建一个bitmap,bitmap优化写入速度的同时带来几个新的问题:

  1. 稀疏的用户分组(e.g. 在两亿用户中圈定几百人)
  2. 检索服务延时增加

对于稀疏分组,Grab进一步改进使用Roaring Bitmaps(一种压缩bitmap);牺牲的检索速度,只能通过进入缓存来优化

image.png

最后的问题

如果用户ID系统使用类似UUID的方案设计,Grab的用户分组还可以这么设计吗?