【用户运营数据中心】人群方案

相关概念

人群

人群是一个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图

人群数据库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
上一篇
下一篇