Blacklist:执行反馈、卸载历史与查询
黑名单设备执行反馈与时序记录
设备拿到策略并不代表已经执行。卸载操作与杀进程操作有不同反馈粒度:卸载保存一次事件明细,杀进程保存设备按日期上报的次数。前者在 MySQL,后者在 TDengine;后台根据策略类型选择查询来源,再适配成统一的结果展示。
需要实际查找某策略、某设备或某时间窗口的数据时,见分表、索引与查询指引。该页区分当前 Mapper 条件与建议 SQL,特别说明 MySQL 入库时间筛选不等于设备时间筛选。
卸载反馈:事件级 MySQL 记录
task 的设备事件服务收到 BLACK_OP_CALL_BACK,将黑名单 ID 列表、MAC、CPU、事件 ID 和设备时间发到 kafka.topic.black-call-back。blacklist 的 BlackCallbackConsumer 拆成每个策略一条 flow_blacklisted_device,然后发送 ApkUninstallUpdateEvent。这个后续事件默认主题为 apk-uninstall-update,可由 kafka.topic.apk-uninstall-update 覆盖。
已核对的下游是 report 的 ApkUninstallUpdateConsumer:它调用推送历史服务补充 CPU 与卸载时间,不应写成 device 服务已经更新安装清单。blacklist 构造该事件时使用当前服务时间作为卸载时间;明细里的 device_time 则来自设备上报。这两种时间不同,跨模块对账时要保留来源。
消费者对每条策略单独捕获异常并继续,MySQL 写入后才发送后续事件。源码没有在这里建立 MySQL 与 Kafka 的原子事务,因此“有明细”不能证明 report 已更新,“无明细”也不能反推设备未执行。本次只证实源码链路与物理结构,未发送消息或验证消费结果。
| Java 字段 | 映射列 | Java 类型 | 业务含义 |
|---|---|---|---|
| id | id | Long | 明细主键;实库 int、自增 |
| blacklistedId | blacklisted_id | Long | 本次执行对应的策略 ID |
| mac | mac | String | 设备 MAC |
| cpu | cpu | String | 设备 CPU 标识,与 MAC 共同定位设备 |
| eventId | event_id | Integer | 设备上报事件标识;消费者从消息 ID 转换 |
| deviceTime | device_time | Date | 设备侧发生时间;上报时间不小于 0 才赋值 |
| createTime | create_time | Date | 插入时填充的服务侧记录时间 |
该 DO 不继承 BaseDO,无软删除、租户和额外审计字段。实测索引为 PRIMARY(id)、唯一索引 blacklisted_id(blacklisted_id, mac, cpu, event_id, device_time);不能将它缩写成“每设备每策略只有一条”。两个末尾字段可空,空值情况下也不能据此宣称严格的全量去重保证。常见查询按策略、MAC、CPU 和创建时间过滤;后台禁止直接编辑反馈数据。
杀进程反馈:按天的 TDengine 记录
task 将 BLACK_KILL_CALL_BACK 发到 kafka.topic.black-kill-call-back。blacklist 消费者逐项读取上报日期、策略 ID、frequency,补充设备身份与接收时间,经 AppKillRecordMapper 写入 blacklisted.app_kill_record。frequency 是上报的计数值,消费者直接赋值写入,没有在这里做 旧值 + 新值 的累加。
业务粒度是“一个策略下,一台设备在某天的杀进程反馈”。ts 由上报的 yyyy-MM-dd 解析;create_time 是服务器消费时间。时区没有从本次结构采集中运行验证,不应把两者换算成未经核实的 UTC 日界线。
| Java 字段 | 物理字段或定位角色 | Java 类型 | 实测类型 / 含义 |
|---|---|---|---|
| ts | ts | Date | TIMESTAMP;上报日期 |
| dataKey | data_key | String | VARCHAR(1000),实测标注 COMPOSITE KEY;getter 返回 mac + cpuId |
| mac | mac | String | VARCHAR(20);设备 MAC |
| cpuId | cpu_id | String | VARCHAR(255);设备 CPU 标识 |
| frequency | frequency | Integer | INT;该设备上报的杀进程次数 |
| createTime | create_time | Date | TIMESTAMP;接收时间 |
| blackListId | black_list_id | Integer | INT TAG;策略 ID 的标签 |
| tbname | 子表定位信息,不是 DESCRIBE 的普通列 | String | getter 返回 app_kill_record_{blackListId} |
实测共有 6 个数据字段加 1 个标签,46 张子表,无普通表。data_key 的拼接顺序以 getter 为准:MAC 在前、CPU 在后,中间没有分隔符,不能照旧注释写成 CPU+MAC。复合键中的日期/设备维度和策略子表一起说明数据身份;本轮没有通过重复写入试验验证数据库更新语义。
子表数量来自统一元数据统计,不等于有效策略数量:配置可删除,已有 TDengine 数据不会因此删除。采集没有逐张输出子表名称和 tag 值,因此 46 张子表是否全部符合当前命名规则尚未逐项比对;命名规则是源码预期,超级表结构与数量是实测事实。