跳到主要内容

Task 数据库设计总览

Task 负责设备任务投放、推送回调、UOTA 升级与域名分发、应用活跃和运行统计,以及跨服务异步导出。理解本服务时,先分清“运营配置”“设备执行结果”“应用统计”三条业务链:它们由同一服务协调,但存储位置与状态含义不同。

Task 已有独立库 ik_yudao_task,同时仍依赖单体遗留库 nebula_ids。 当前微服务改造未完成,不能把这一现状简化为“device 与 task 共用一个业务库”,也不能因为存在独立库就认定任务主表已迁移。MySQL 与 TDengine 都有名为 nebula_ids 的库,二者是不同存储系统。

数据源与业务归属​

路由别名存储位置当前承担的业务
masterMySQL nebula_ids任务主表、设备推送状态、角色授权、下载记录、运行排行榜、异步导出;单体遗留依赖
uotaMySQL ik_yudao_taskUOTA 版本及渠道/MAC关联、域名池与 APK 池、SDK密钥、运行归档记录
taskAppActivityMySQL ik_thirdparty应用活跃原始日志动态表及旧统计表
tdAppActivityDay/Month/YearTDengine app_activity_day/month/year同一应用活跃业务的日、月、年维度
tdAppRuntimeTDengine nebula_ids应用运行热数据,超级表 flow_app_runtime
tdAppRuntimeArchiveTDengine app_runtime_archive应用运行归档数据,同名超级表
Redis公共 Redis 配置任务缓存、设备任务 Hash、UOTA 版本索引、导出并发槽位、布隆过滤器;未采集运行数据

路由依据:doc/数据库设计管理/nacos/task-server.yaml:10 起的数据源定义;Java 常量位于 framework/core/constant/DataSourceConstants.java:15。本文后续 Java 路径均相对 ik_project/yudao-cloud/yudao-module-task/yudao-module-task-biz/src/main/java/cn/iocoder/yudao/module/task/;XML 路径相对同模块 src/main/resources/。

阅读顺序​

  1. 任务投放、审批和执行反馈:为什么任务定义和设备执行状态分表,如何关联 rule、bpm、infra、system。
  2. UOTA 升级与域名分发:渠道升级版本、域名池与 APK 池分别控制什么。
  3. 应用活跃、运行统计与归档:日志如何形成日/月/年统计,热库与归档库如何分工。
  4. 异步导出和事件归属:哪些数据由 Task 接收,哪些由其他服务最终存储。
  5. 完整源码映射与实测差异:实体、数据源、实际对象、索引和待确认项。
  6. 应用数据查询与优化指南:区分运行 TD、安装 ES、活跃原始日表,按业务选择时间范围、分区和索引,并说明当前限制。

本次核验范围​

核验日期为 2026-09-18,使用主代理统一采集的测试环境元数据与当前工作区源码;没有启动业务服务、执行编译或业务测试,也没有读取业务记录。17 个持久化模型覆盖 14 张固定 MySQL 表、1 类 MySQL 动态表和2类 TDengine 超级表模型;其中 TDengine 模型分别展开到3个活跃库、2个运行库。

ik_yudao_task 实测8张表,其中7张有当前实体映射;额外的 task_flow_uota_download 列入未确认读写清单。ik_thirdparty 实测25张应用活跃动态表,另有 app_activity_count 和非本服务当前映射的 launcher_ad_play_count。未发现本服务直接 ES 实体或索引读写,不能据此否认其他服务在接收相同 Kafka 事件后写 ES。

字段类型、长度、空值、默认值、索引和约束以遗留 MySQL 库、Task 独立库、第三方应用库的采集附录为准。本文关注业务解释;源码注释与实际行为不一致时在差异页并列说明。

Task 完整源码映射与实测差异​

核验时间2026-09-18。此页将当前源码模型与测试环境实际结构对照,用于维护数据库设计;未读取业务行、没有确认生产环境结构,也没有执行修复DDL。配置绑定采用统一采集清单的service_bindings.task,不能用清单中master对应的库代替整个服务所有数据源。

完整持久化映射​

以下DO路径均相对总览指定的Java根下dal/dataobject/。Mapper与其同业务目录对应,14张固定MySQL表全部在选定路由的实库中找到。

模型及证据位置实际对象路由/写入者
task/TaskDO.java:20MySQL nebula_ids.base_task_device默认master,TaskService/TaskBpmService
taskdevice/TaskDeviceDO.java:21MySQL nebula_ids.flow_task_device默认master,TaskDeviceService/回调/运行消费者
role/TaskRoleDO.java:16MySQL nebula_ids.flow_task_role默认master,TaskRoleService
appdownload/AppDownloadDO.java:20MySQL nebula_ids.flow_app_download默认master,AppDownloadConsumer/Service
appruntime/AppRuntimeTopDO.java:21MySQL nebula_ids.stats_app_runtime_top默认master,AppRuntimeJob/Service
export/BaseExportTaskDO.java:16MySQL nebula_ids.base_export_task默认master,导出API/Service
uotadetail/UotaDetailDO.java:21MySQL ik_yudao_task.task_uota_detailMapper @DS(uota),UotaDetailService
uotadetail/FlowUotaChannelDO.java:16MySQL ik_yudao_task.task_flow_uota_channelMapper @DS(uota),UotaDetailService
uotadetail/FlowUotaMacDO.java:16MySQL ik_yudao_task.task_flow_uota_macMapper @DS(uota),UotaDetailService
domain/DomainDO.java:15MySQL ik_yudao_task.task_domainMapper/Service @DS(uota),DomainService
domain/DomainUotaAppDO.java:14MySQL ik_yudao_task.task_domain_uota_appMapper/Service @DS(uota),DomainUotaAppService
secretkey/TaskSecretKeyDO.java:19MySQL ik_yudao_task.task_secret_keyMapper @DS(uota),TaskSecretKeyService
appruntime/AppRuntimeArchiveRecord.java:20MySQL ik_yudao_task.task_app_runtime_archive_recordMapper @DS(uota),AppRuntimeArchiveJob
appactivity/AppActivityCountDO.java:16MySQL ik_thirdparty.app_activity_countMapper @DS(taskAppActivity),AppActivityCountService
appactivity/AppActivityLogDO.java:20MySQL ik_thirdparty.app_activity_log_*XML动态表名,Mapper @DS(taskAppActivity);AppActivityJob建表、消费者写入
appactivity/AppActivityDetailDO.java:18TD app_activity_day/month/year.app_activity_detailDetail/Day/Month/Year Mapper按TD别名选库
appruntime/AppRuntimeDO.java:18TD nebula_ids/app_runtime_archive.flow_app_runtimeRuntime/Hot/Archive Mapper按TD别名选库

默认master映射没有单独@DS,本次检查了调用它们的Service和消费者路由。关键显式路由证据:dal/mysql/uotadetail/UotaDetailMapper.java:18、dal/mysql/domain/DomainMapper.java:18、dal/mysql/secretkey/TaskSecretKeyMapper.java:18、dal/mysql/appruntime/AppRuntimeArchiveRecordMapper.java:16、dal/mysql/appactivity/AppActivityLogMapper.java:23、dal/tdengine/appactivity/AppActivityDetailMapper.java:28、dal/tdengine/appruntime/AppRuntimeMapper.java:26及Hot/Archive Mapper:16。

BaseExportTaskDO、DomainDO、DomainUotaAppDO、TaskSecretKeyDO继承BaseDO的create_time/update_time/creator/updater/deleted;其他模型按自身声明和实际SQL解释,不能统一补上租户/审计列。BaseDO源码位于ik_project/yudao-cloud/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/dataobject/BaseDO.java。@KeySequence不代表本次MySQL实例另有同名sequence。

已确认差异与待确认事项​

项目源码与实测结果维护含义
应用活跃统计实体AppActivityCountDO.java:57/64有beginDate/endDate,未标exist=false;实表无begin_date/end_date,有实体未声明的country不能把前端辅助日期字段列成实库列;通用CRUD存在映射兼容风险,具体报错路径未运行验证
Task审批有效状态TaskDO/TaskDeviceDO旧注释写0有效、1无效;Service实际用BpmBusinessValid的0—5状态文档采用当前调用链语义;不能按旧注释解释数据,也不能把该枚举套用到Boolean型UOTA字段
V2推送资源类型实体保留广告0、APP1、launcher2;TaskServiceImpl.java:463起的响应外层固定taskType=1旧编码与当前V2行为并列记录,不能把历史表字段视为仍在执行的全部业务策略
租户及删除列base_task_device实库有deleted/tenant_id但TaskDO未声明;task_uota_detail实库有tenant_id;4个BaseDO子类实库有tenant_id属于物理列与实体范围差异;租户由公共拦截器等机制参与,不能认定所有列都直接映射在DO里
UOTA下载记录独立库有task_flow_uota_download,未找到本模块当前Java/XML读写标为实际存在、当前归属路径待核验,不按注释补造消费者
第三方库额外表ik_thirdparty.launcher_ad_play_count不在Task当前实体中与launcher核对历史归属,不能因同库就归Task所有
旧MySQL运行明细遗留MySQL库有flow_app_runtime;当前AppRuntimeDO实际由TD Mapper使用同名不同引擎对象必须分列;未认定MySQL旧表仍是当前运行写入目标
旧任务对象遗留库仍有base_task/base_task_rule/flow_task_channel* /flow_task_model/flow_task_region/flow_task_flow等历史对象当前Task未找到这些表的直接Mapper;V2改走rule服务,存在不等于已迁移或可删除
关系约束UOTA渠道/MAC关系、角色关系和归档day均未有业务组合唯一键;Service有部分去重检查业务规则与数据库约束分开记录,不声称数据库保证并发唯一性
TD动态结构活跃与运行均有超级表与子表,tbname为路由伪列,TAG与COMPOSITE KEY已采集动态子表数量为采集时点结果;不等于有效设备数、记录数或业务覆盖率

实测外键核对:Task当前固定MySQL表没有外键;nebula_ids另有5项历史外键,属于其他历史表,详见遗留库完整约束。Task→device渠道/设备、Task→system角色、Task→infra文件、Task→bpm流程、Task→rule业务ID均按代码逻辑关联描述。

证据与后续维护​

  • 实测快照文件为mysql-nebula_ids.json、mysql-ik_yudao_task.json、mysql-ik_thirdparty.json及5个tdengine-*.json;只使用结构、索引、约束和子表数量,未读取业务数据。
  • 固定表全字段见Task独立库、遗留库、应用库,TD字段与标签从应用统计页进入各库附录。
  • 新增字段、修改状态、改规则关联、调整动态表命名或切换数据源时,应同步更新对应业务页与本映射表;若实测DDL未跟随改动,差异保留到下一次核验,不把预期设计覆盖成已实现状态。
  • 未实测Redis、未跑消息链或归档任务、未验证生产DDL与历史记录迁移。当前只交付文档,不修复源码或数据库。
用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答