相关概念
人群
人群是一个uid集合。用户通过标签、手动上传、算法模型等方式创建人群,再针对这些uid进行定向运营,如发券,个性化资源位等。
人群类型
- 标签规则人群:使用多个标签的与或非关系创建的人群。
- 上传人群:用户手动生成的人群,导入系统。
- 算法人群:针对不同场景开发算法模型,根据用户的输入产出不同的uid集合。
人群时效性
- 离线:离线圈选产出物理人群uid集合,时效性通常为T-1。
- 实时:根据实时标签+规则,使用模板引擎实时判定uid,无物理人群uid集合,时效性通常为秒级。
- 混合:离线人群+实时人群,根据与或非的逻辑,生成的新人群。离线部分时效性通常为T-1,实时部分时效性通常为秒级。
架构图
生产側数据流
生产側时序
消费側架构
消费側时序
组装人群规则
提交/修改人群
人群状态变更
领域设计
人群
public class Crowd {
private String crowdId; // 人群id
private String name; // 人群名称
private CrowdSchema schema; // 人群schema
private CrowdTimelinessTypeEnum timelinessType; // 人群时效性
private Long countSnapshot; // 人群数量快照
private ExtraCrowdIds extraCrowdIds; // 黑白名单
private CrowdStateTypeEnum state; // 状态
private Date expireAt; // 过期时间
private final User ownerUser; // 所属用户
private final Date createdAt; // 创建时间
private Date schemaUpdatedAt; // schema更新时间
private Date stateUpdatedAt; // state更新时间
}
public class CrowdSchema {
private final CrowdSchemaTypeEnum schemaType;// 人群格式枚举
private final DslCrowdMeta dslCrowdMeta; // 规则人群元数据
private final TosCrowdMeta tosCrowdMeta; // tos上传人群元数据
private final HiveCrowdMeta hiveCrowdMeta; // 外部hive人群
private final FeatureMatchingCrowdMeta featureMatchingCrowdMeta; // 扩展优选人群
}
public class DslCrowdMeta {
private StandardConditionRoot condition;// 规则圈选条件
private WebCondition webCondition; // 前端规则圈选条件(快照)
}
public class TosCrowdMeta {
private List<TosFileMeta> tosFiles; // tos文件uri
}
public class TosFileMeta {
private String fileName; // 文件名private String url; // url
}
public class HiveCrowdMeta {
private HiveTask hiveTask; // hive任务信息private List<FieldFilterCondition> fieldFilterConditions; // 条件,多条件间用and
}
public class HiveTask {
private String dbName; // hive库名private String tableName; // hive表名private String taskId; // 任务id(需要挂血缘时必填)
}
public class FieldFilterCondition {
private String fieldName; // 列名private FieldDataTypeEnum fieldDataType; // 数据类型private OperatorTypeEnum operatorType; // 过滤逻辑private List<String> values; // 值
}
public class FeatureMatchingCrowdMeta {
private String baseObjectId; // 基础人群private MatchingTypeEnum matchingType; // 扩展/优选private FeatureTypeEnum featureType; // 匹配特征,相似度/标签/随机private Long baseNum; // 基础人群数量private Long targetNum; // 目标数量private String tagId; // 匹配特征为标签时,标签idprivate Boolean includeBase; // 扩展时,是否包含基础人群
}
public class CrowdTask {
private final CrowdTaskTypeEnum taskType; // 生产任务类型
private final String crowdId; // 人群id
private CrowdTaskStateTypeEnum state; // 任务状态
private final Date createdAt; // 创建时间
private Date stateUpdatedAt; // state更新时间
private CrowdPackage crowdPackage; // 人群包
}
public class CrowdPackage {
private final String version; // 版本号(C端可用)
private final Long count; // 人群包大小
private final StorageInfo storageInfo; // 人群包存储介质
private final Date createdAt; // 人群包创建时间
private final Date expireAt; // 人群包过期时间
}
public class StorageInfo {
private final StorageTypeEnum dbType; // DB类型
private final HiveInfo hiveInfo; // hive表信息
}
public class HiveInfo {
private final String db; // 库
private final String table; // 表
private final List<Entity> partition; // 多级分区
}
public interface CrowdService {
// 获取人群
Crowd getCrowdById(String crowdId);
// 批量获取人群
List<Crowd> batchGetCrowdsByIds(List<String> crowdIds);
// 获取人群任务
CrowdTask getCrowdTaskById(String crowdId);
// 批量获取人群任务
List<CrowdTask> getCrowdTasksByIds(List<String> crowdIds);
// 创建人群
void createCrowd(Crowd crowd, User user);
// 更新人群
void updateCrowd(Crowd newCrowd, Crowd oldCrowd, User user);
// 搜索人群
PageData<Crowd> searchCrowdsByIdOrName(String keyWord, String ChannelCode, String createUid, SortCondition sort, Page page);
// 获取人群依赖
List<String> searchForDependencies(String crowdId);
// 人群延期
void extendCrowdExpireDate(String crowdId, Date expireAt, User user);
// 更新人群黑白名单
void updateExtraCrowdIds(Crowd crowd, ExtraCrowdIds extraCrowdIds, User user);
// 删除人群
void deleteCrowd(Crowd crowd, User user);
// 人群流水
List<CrowdLog> listOperateLogs(Crowd crowd, List<CrowdOperateTypeEnum> operateTypes);
// 刷新人群
void refresh(Crowd crowd, User user);
// 人群提交回调
void callbackOnCrowdSubmited(CrowdTask crowdTask, boolean isSuccess);
// 人群生产回调
void callbackOnCrowdProduced(CrowdTask crowdTask, boolean isSuccess);
// 人群过期回调
void callbackOnCrowdExpired(Crowd crowd);
// 人群即将过期回调
void callbackOnCrowdNearlyExpired(Crowd crowd);
// 人群刷新数量回调
void callBackOnRefreshCrowdCountSnapshot(Crowd crowd);
}
库表结构
ER图
人群
CREATE TABLE `tt_crowd` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`crowd_id` varchar(255) NOT NULL COMMENT '人群id',
`name` varchar(255) NOT NULL COMMENT '人群名称',
`timeliness_type` tinyint NOT NULL COMMENT '时效性: 1:实时 2:离线 3:混合',
`state` tinyint NOT NULL COMMENT '状态: 0:删除 1:有效 2:即将过期 3:过期',
`schema_type` tinyint NOT NULL COMMENT '人群类型: 1:规则 2:HIVE 3:TOS 4:扩展优选',
`schema` json NOT NULL COMMENT '人群schema',
`expire_at` timestamp NULL COMMENT '过期时间',
`count_snapshot` bigint NOT NULL COMMENT '人群快照大小,-1为无效',
`owner_id` varchar(255) NOT NULL COMMENT '人群所有者id',
`owner_name` varchar(255) NOT NULL COMMENT '人群所有者名称',
`owner_email` varchar(255) NOT NULL COMMENT '人群所有者邮箱',
`created_at` timestamp NULL COMMENT '创建时间',
`updated_at` timestamp NULL COMMENT '更新时间',
`state_changed_at` timestamp NULL COMMENT 'state更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY (`crowd_id`)
) ENGINE=InnoDB
CREATE TABLE `tt_crowd_task` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`crowd_id` varchar(255) NOT NULL COMMENT '人群id',
`task_type` tinyint NOT NULL COMMENT '人群生产任务类型: 1:手动 2:每日',
`state` tinyint NOT NULL COMMENT '状态: 0:失效 1:初始化 2:提交成功 -2:提交失败 3:生产成功 -3:生产失败 4:过期',
`created_at` timestamp NULL COMMENT '创建时间',
`state_changed_at` timestamp NULL COMMENT 'state更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY (`crowd_id`)
) ENGINE=InnoDB
CREATE TABLE `tt_crowd_package` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`crowd_id` varchar(255) NOT NULL COMMENT '人群id',
`version` varchar(255) NOT NULL COMMENT '版本号',
`count` bigint NOT NULL COMMENT '人群数量',
`storage_type` tinyint NOT NULL COMMENT '存储介质类型: 1:HIVE',
`storage_info` json NOT NULL COMMENT '存储介质位置',
`created_at` timestamp NULL COMMENT '创建时间',
`expire_at` timestamp NULL COMMENT '过期时间',
PRIMARY KEY (`id`),
UNIQUE KEY (`crowd_id`)
) ENGINE=InnoDB
CREATE TABLE `tt_crowd_extra_ids` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`crowd_id` varchar(255) NOT NULL COMMENT '人群id',
`black_uids` json NOT NULL COMMENT '黑名单uid',
`black_dids` json NOT NULL COMMENT '黑名单did',
`white_uids` json NOT NULL COMMENT '白名单uid',
`white_dids` json NOT NULL COMMENT '白名单did',
PRIMARY KEY (`id`),
UNIQUE KEY (`crowd_id`)
) ENGINE=InnoDB