# data-ana 工作排期 > 负责人:ai11 > 关联:[workline.md](../workline.md)、[coord.md](../coord.md)、[contracts/data-ana_contract.md](../contracts/data-ana_contract.md)、[objections/data-ana_issue.md](../objections/data-ana_issue.md) > 模式:全并行(各 AI 一口气完成 P2-P6 全部代码,开发期间用 mock,最后统一集成测试) > 基线日期:批次 0 已完成(2026-07-09),批次 1(P2)2026-07-10 启动 --- ## §1 总览 data-ana 是 D6 智能洞察领域的纯读模型服务(Python/FastAPI),基于 ClickHouse ReplacingMergeTree 宽表 + Debezium CDC 消费实现实时学情分析。 **核心交付物**: - gRPC server :50055 + AnalyticsService 12 RPC(含 1 个 Server Streaming) - HTTP :3006 14 端点(3 基础 + 11 业务,保留作 Gateway 直连降级) - ClickHouse 5 宽表(student_dashboard_view / student_errors / mastery_snapshot / attendance_logs / ai_usage_log) - CDC 消费者(core-edu MySQL binlog → Kafka → ClickHouse 宽表投影) - 掌握度计算(加权滑动平均 + 遗忘曲线)+ 预警评估 - 派生数据事件发布(edu.insight.mastery.updated / edu.insight.warning.triggered,豁免 Outbox) **阶段里程碑**: - P2 预备:ClickHouse 接入 + CDC 骨架 + ActionState 信封重构 + mock 数据集 - P3 预备:CDC 通道接入 + 掌握度算法 v1 + Repository 封装 - P4 主战场:gRPC 50055 启用 + 12 RPC + 4 端 Dashboard + Warning + DataScope + 事件发布 - P5 扩展:SubscribeMasteryUpdate stream + AI 用量消费 + 手动 commit - P6 硬化:CDC 水平扩展 + 容量规划 + 数据治理 + 监控告警 --- ## §2 全阶段甘特图(P2-P6) ```mermaid gantt title ai11 data-ana 全阶段排期 dateFormat YYYY-MM-DD axisFormat %m-%d section P2 预备(与批次1并行) 2.1 ClickHouse DDL 5宽表建表 :a11a, 2026-07-10, 2d 2.2 CDC消费骨架(aiokafka) :a11b, after a11a, 2d 2.3 mock数据集(30学生×5考试×10作业) :a11c, after a11a, 1d 2.4 ActionState信封重构(P0整改) :crit, a11d, 2026-07-10, 2d 2.5 config.py修正(env/Redis/gRPC) :a11e, after a11d, 1d section P3 预备(与批次2并行) 3.1 gRPC server骨架(3 RPC,不启用) :a11f, after a11b, 2d 3.2 core-edu CDC通道接入(grades/exams/homework) :a11g, after a11b, 3d 3.3 ExamCache内存LRU :a11h, after a11g, 1d 3.4 掌握度算法v1(weighted_moving_avg) :a11i, after a11g, 2d 3.5 ClickHouseRepository(FINAL/argMax) :a11j, after a11i, 2d section P4 主战场(批次3, 11d) 4.1 gRPC 50055正式启用 :crit, a11k, after a11j, 1d 4.2 analytics.proto扩展12 RPC :crit, a11l, after a11k, 2d 4.3 4端Dashboard RPC实现 :a11m, after a11l, 3d 4.4 WarningService+TriggerWarning :a11n, after a11l, 2d 4.5 GetMasteryDistribution+GetStudentMastery :a11o, after a11m, 1d 4.6 iam.GetEffectiveDataScope集成(降级兜底) :crit, a11p, after a11k, 2d 4.7 DataScope 6级WHERE注入 :a11q, after a11p, 1d 4.8 attendance+content CDC消费 :a11r, after a11g, 2d 4.9 MasteryEvent+WarningTriggered发布 :a11s, after a11n, 1d 4.10 HTTP 14端点+readyz硬化 :a11t, after a11m, 2d section P5 扩展(批次4并行) 5.1 SubscribeMasteryUpdate stream RPC :a11u, after a11t, 3d 5.2 AIUsageEvent消费→ai_usage_log :a11v, after a11u, 2d 5.3 手动commit替换auto_commit :a11w, after a11v, 1d 5.4 Admin Dashboard AI用量区块 :a11x, after a11v, 2d section P6 硬化(批次5并行) 6.1 CDC多实例水平扩展 :a11y, after a11x, 3d 6.2 ExamCache Redis化 :a11z, after a11y, 2d 6.3 容量规划+TTL归档策略 :a11aa, after a11z, 2d 6.4 监控告警(consumer lag HPA) :a11ab, after a11aa, 2d 6.5 readyz深度硬化 :a11ac, after a11ab, 1d ``` > **关键路径**(crit):ActionState 信封重构 → gRPC 50055 启用 → analytics.proto 扩展 → iam GetEffectiveDataScope 集成 > **总工期**:约 51 天(2026-07-10 ~ 2026-08-30),其中 P4 主战场 11 天为关键交付期 --- ## §3 详细任务 ### 3.1 P2 预备期(2026-07-10 ~ 2026-07-18,8d) #### 任务 2.1:ClickHouse DDL 5 宽表建表 - **负责人**:ai11 - **依赖**:无(ClickHouse 实例就绪,由 infra 提供) - **交付物**:`infra/clickhouse/ddl/data_ana.sql`(5 宽表 DDL:student_dashboard_view / student_errors / mastery_snapshot / attendance_logs / ai_usage_log) - **验收标准**:5 表在 ClickHouse 中创建成功,ReplacingMergeTree 引擎 + ORDER BY + PARTITION BY 符合 02 §3 DDL 设计 #### 任务 2.2:CDC 消费骨架 - **负责人**:ai11 - **依赖**:Kafka 就绪 - **交付物**:`src/data_ana/cdc_consumer.py` 重构(aiokafka AIOKafkaConsumer + EventHandler 路由框架) - **验收标准**:能消费 mock CDC 事件并打印路由日志,consumer group = `data-ana-cdc` #### 任务 2.3:mock 数据集 - **负责人**:ai11 - **依赖**:任务 2.1 - **交付物**:`scripts/seed_clickhouse.py`(批量导入 30 学生 × 5 考试 × 10 作业 × 30 天出勤模拟数据) - **验收标准**:ClickHouse 5 表有数据,可查询返回非空结果 #### 任务 2.4:ActionState 信封重构(P0 整改,coord-cross-review §5.3) - **负责人**:ai11 - **依赖**:无 - **交付物**:`src/data_ana/shared/action_state.py`(ActionState[T] 泛型 + ActionStateError + ok()/fail() 类方法) - **验收标准**:main.py 所有端点返回 `ActionState[T]`,degraded 标记在顶层 `details.degraded`(非 error.details),ruff 零错误 #### 任务 2.5:config.py 修正 - **负责人**:ai11 - **依赖**:无 - **交付物**:`src/data_ana/config.py` 修正(env_prefix 补 Redis / gRPC / ClickHouse 配置项,pydantic-settings 校验) - **验收标准**:配置项覆盖 02 §13 配置清单,环境变量缺失时 pydantic-settings 报错 --- ### 3.2 P3 预备期(2026-07-18 ~ 2026-07-26,8d) #### 任务 3.1:gRPC server 骨架(3 RPC,不正式启用) - **负责人**:ai11 - **依赖**:analytics.proto 当前 3 RPC(无需 coord 补全) - **交付物**:`src/data_ana/grpc_server.py`(grpc.aio Server 骨架 + 3 RPC 实现,绑定 :50055 但不启动对外) - **验收标准**:本地可启动 gRPC server,3 RPC 可调用返回 mock 数据 #### 任务 3.2:core-edu CDC 通道接入 - **负责人**:ai11 - **依赖**:core-edu MySQL 就绪 + Debezium CDC 配置(core-edu 就绪前用 mock binlog 事件) - **交付物**:`src/data_ana/cdc_consumer.py` 完善(EventHandler 处理 grades/exams/homework/classes 表 CDC 事件) - **验收标准**:消费 CDC 事件 → 解析 Debezium JSON → 查 ExamCache 填 class_id → upsert ClickHouse 宽表 #### 任务 3.3:ExamCache 内存 LRU - **负责人**:ai11 - **依赖**:任务 3.2 - **交付物**:`src/data_ana/exam_cache.py`(内存 LRU dict,max 10000 条,exam_id → {class_id, subject_id}) - **验收标准**:CDC exams 事件触发 ExamCache 更新,grades 事件查 ExamCache 获取 class_id #### 任务 3.4:掌握度算法 v1 - **负责人**:ai11 - **依赖**:任务 3.2 - **交付物**:`src/data_ana/mastery_service.py`(加权滑动平均算法,权重 w_i = 0.6^i,归一化) - **验收标准**:输入学生近期 N 次成绩 → 输出 mastery_level (0.0-1.0) → 写 mastery_snapshot 表 #### 任务 3.5:ClickHouseRepository 封装 - **负责人**:ai11 - **依赖**:任务 2.1 - **交付物**:`src/data_ana/clickhouse_client.py` 重构(查询封装 + FINAL/argMax 去重 + DataScope WHERE 注入接口) - **验收标准**:查询 student_dashboard_view 返回去重后最新版本数据 --- ### 3.3 P4 主战场期(2026-07-26 ~ 2026-08-06,11d,批次 3) #### 任务 4.1:gRPC 50055 正式启用 - **负责人**:ai11 - **依赖**:任务 3.1 - **交付物**:main.py lifespan 启动 gRPC server :50055,HealthService.Check 返回 SERVING - **验收标准**:gRPC server 对外可访问,HealthService.Check = SERVING #### 任务 4.2:analytics.proto 扩展 12 RPC - **负责人**:ai11(本分支内补全 proto,提请 coord 合并) - **依赖**:ISSUE-003 解决(coord 确认或 ai11 自行补全) - **交付物**:`packages/shared-proto/proto/analytics.proto` 扩展至 12 RPC(3 现有 + 9 新增 message 定义) - **验收标准**:`buf lint` 零错误,`buf generate` 生成 Python stub 成功,12 RPC 全部可调用 #### 任务 4.3:4 端 Dashboard RPC 实现 - **负责人**:ai11 - **依赖**:任务 4.2 - **交付物**:GetTeacherDashboard / GetStudentDashboard / GetParentDashboard / GetAdminDashboard 4 RPC 实现 - **验收标准**:4 RPC 返回 ActionState[DashboardData],DataScope 过滤生效,降级时返回骨架数据 + degraded: true #### 任务 4.4:WarningService + TriggerWarning - **负责人**:ai11 - **依赖**:任务 3.4(掌握度算法) - **交付物**:`src/data_ana/warning_service.py`(预警阈值评估 + TriggerWarning RPC + GetWarnings RPC) - **验收标准**:掌握度 < 0.4 触发 LOW_MASTERY 预警,成绩环比下降 20% 触发 SCORE_DROP,缺勤 ≥ 3 次/周触发 ABSENT_FREQUENT #### 任务 4.5:GetMasteryDistribution + GetStudentMastery - **负责人**:ai11 - **依赖**:任务 3.4 + 任务 4.2 - **交付物**:2 RPC 实现(班级掌握度分布 + 学生知识点掌握度明细) - **验收标准**:返回 mastered/progressing/weak 三档分布数据 #### 任务 4.6:iam.GetEffectiveDataScope 集成(降级兜底) - **负责人**:ai11 - **依赖**:ISSUE-001 解决(iam.proto 补全 GetEffectiveDataScope)。若 P4 时 iam 未就绪,使用降级兜底 - **交付物**:`src/data_ana/iam_client.py`(gRPC 调 iam.GetEffectiveDataScope + Redis 缓存 5min + 降级兜底) - **验收标准**:iam 可用时调 gRPC 获取 DataScope;iam 不可用时按 role 映射默认 DataScope + degraded: true #### 任务 4.7:DataScope 6 级 WHERE 注入 - **负责人**:ai11 - **依赖**:任务 4.6 + 任务 3.5 - **交付物**:ClickHouseRepository 查询方法注入 DataScope WHERE 子句(SELF/CLASS/GRADE/SCHOOL/DISTRICT/ALL) - **验收标准**:教师只能查自己班级数据,学生只能查自己数据,管理员可查全校数据 #### 任务 4.8:attendance + content CDC 消费 - **负责人**:ai11 - **依赖**:任务 3.2(CDC 框架) - **交付物**:EventHandler 扩展 attendance_logs 表 CDC + content_knowledge_points 表 CDC - **验收标准**:考勤事件落 attendance_logs 表,知识点事件更新 mastery_snapshot 元数据 #### 任务 4.9:MasteryEvent + WarningTriggered 事件发布 - **负责人**:ai11 - **依赖**:任务 3.4 + 任务 4.4 - **交付物**:`src/data_ana/kafka_producer.py`(aiokafka AIOKafkaProducer + idempotent + transactional_id) - **验收标准**:掌握度计算完成发布 `edu.insight.mastery.updated`,预警触发发布 `edu.insight.warning.triggered`,豁免 Outbox #### 任务 4.10:HTTP 14 端点 + readyz 硬化 - **负责人**:ai11 - **依赖**:任务 4.3 + 任务 4.4 + 任务 4.5 - **交付物**:main.py 14 个 HTTP 端点全部实现(3 基础 + 11 业务)+ /readyz 检查 4 依赖(clickhouse/cdc_consumer/redis/iam_grpc) - **验收标准**:14 端点返回 ActionState[T],/readyz 依赖检查正确反映服务状态 --- ### 3.4 P5 扩展期(2026-08-06 ~ 2026-08-19,13d,批次 4 并行) #### 任务 5.1:SubscribeMasteryUpdate Server Streaming RPC - **负责人**:ai11 - **依赖**:任务 4.2 + 任务 4.9 - **交付物**:SubscribeMasteryUpdate RPC 实现(server-streaming,客户端订阅 student_id/class_id,掌握度更新时推送) - **验收标准**:客户端订阅后,掌握度计算完成时收到 MasteryUpdateEvent 流 #### 任务 5.2:AIUsageEvent 消费 → ai_usage_log - **负责人**:ai11 - **依赖**:ISSUE-002 解决(events.proto 补 AIUsageEvent)+ ai 服务发布 `edu.insight.ai.usage` topic - **交付物**:EventHandler 扩展 AIUsageEvent 消费 → 落 ai_usage_log 表 - **验收标准**:ai 服务发布用量事件后,ai_usage_log 表有数据,Admin Dashboard AI 用量区块可展示 #### 任务 5.3:手动 commit 替换 auto_commit - **负责人**:ai11 - **依赖**:任务 3.2 - **交付物**:cdc_consumer.py 改为 `enable_auto_commit=False` + 手动 commit(at-least-once) - **验收标准**:ClickHouse 写入成功后才 commit offset,重启后无重复消费(依赖 ReplacingMergeTree 去重) #### 任务 5.4:Admin Dashboard AI 用量区块 - **负责人**:ai11 - **依赖**:任务 5.2 - **交付物**:GetAdminDashboard RPC 补全 AI 用量统计区块(按 provider/model/时间窗聚合) - **验收标准**:Admin Dashboard 返回 AI 用量数据,无数据时显示"暂无数据" --- ### 3.5 P6 硬化期(2026-08-19 ~ 2026-08-30,11d,批次 5 并行) #### 任务 6.1:CDC 多实例水平扩展 - **负责人**:ai11 - **依赖**:任务 5.3(手动 commit) - **交付物**:CdcConsumer 支持多实例分摊 partition(consumer group 不变) - **验收标准**:2+ 实例消费同一 topic 无重复无遗漏 #### 任务 6.2:ExamCache Redis 化 - **负责人**:ai11 - **依赖**:任务 6.1 - **交付物**:exam_cache.py 改为 Redis 实现(key: `data_ana:exam:{exam_id}` TTL 30 天) - **验收标准**:多实例共享 ExamCache,重启后缓存不丢失 #### 任务 6.3:容量规划 + TTL 归档策略 - **负责人**:ai11 - **依赖**:无 - **交付物**:ClickHouse TTL 策略(student_dashboard_view 保留 2 年,ai_usage_log 保留 1 年)+ 冷热数据分离方案 - **验收标准**:TTL 配置生效,过期数据自动清理 #### 任务 6.4:监控告警完善 - **负责人**:ai11 - **依赖**:任务 6.1 - **交付物**:Prometheus 指标补全(consumer lag histogram + 慢查询 counter + ClickHouse 连接池 gauge)+ Grafana dashboard - **验收标准**:consumer lag 超阈值触发 HPA,慢查询超阈值告警 #### 任务 6.5:readyz 深度硬化 - **负责人**:ai11 - **依赖**:任务 4.10 - **交付物**:/readyz 检查项完善(ClickHouse 查询超时 1s + Redis ping + iam gRPC 超时 2s + CDC consumer lag < 1000) - **验收标准**:任一依赖不健康时 /readyz 返回 503,K8s 摘流量 --- ## §4 依赖与就绪信号 ### 4.1 我依赖的上游就绪标志 - [ ] **core-edu gRPC 50053 启用**(ai08,批次 2)—— CDC 数据源(grades/exams/homework/attendance 表 binlog) - [ ] **core-edu MySQL Debezium CDC 配置**(ai08 + SRE)—— CDC 通道前提 - [ ] **content gRPC 50054 启用**(ai09,批次 3)—— 知识点维度 CDC - [ ] **iam.proto 补全 GetEffectiveDataScope RPC**(ai06/coord,ISSUE-001)—— DataScope 解析 - [ ] **analytics.proto 扩展至 12 RPC**(coord/ai11,ISSUE-003)—— gRPC stub 生成前提 - [ ] **events.proto 补全 AIUsageEvent message**(coord,ISSUE-002)—— AI 用量消费(P5) - [ ] **ai 服务发布 `edu.insight.ai.usage` topic**(ai12,批次 4)—— AI 用量统计(P5) > **降级兜底**:core-edu / content / iam 未就绪时,使用 ClickHouse 内置 mock 数据集 + 硬编码 DataScope 降级,标注 `details.degraded: true` ### 4.2 我的就绪信号(供下游消费) - [ ] **P4 就绪**:data-ana gRPC 50055 启用(HealthService.Check = SERVING)+ AnalyticsService 12 RPC 可调用 + 4 端 Dashboard 返回结构化数据 - [ ] **P4 就绪**:`edu.insight.mastery.updated` topic 可发布(mastery.updated / warning.triggered) - [ ] **P5 就绪**:SubscribeMasteryUpdate server-streaming RPC 可订阅 - [ ] **P6 就绪**:CDC 多实例水平扩展 + ExamCache Redis 化完成 ### 4.3 下游消费方 | 下游 | 消费接口 | 就绪依赖阶段 | | -------------------------- | ---------------------------------------------------------------- | ------------ | | teacher-bff(ai03) | gRPC 50055 GetTeacherDashboard / GetClassPerformance 等 | P4 | | student-bff(ai04) | gRPC 50055 GetStudentDashboard / GetStudentWeakness 等 | P4 | | parent-bff(ai05) | gRPC 50055 GetParentDashboard | P4 | | ai 服务(ai12) | gRPC 50055 反向调用查学情(GetStudentMastery / GetLearningTrend) | P5 | | core-edu(ai08) | Kafka `edu.insight.mastery.updated`(推荐个性化练习) | P4 | | msg(ai10) | Kafka `edu.insight.warning.triggered`(推送通知) | P4 | --- ## §5 风险与缓解 | 风险 | 影响 | 缓解措施 | | -------------------------------------------- | ---- | ------------------------------------------------------------------------------------------ | | iam.proto 未补全 GetEffectiveDataScope | P4 | 降级兜底:按 role 映射默认 DataScope + degraded: true(ISSUE-001) | | analytics.proto 未扩展 12 RPC | P4 | ai11 本分支自行补全 proto,提请 coord 合并(ISSUE-003) | | core-edu CDC 通道未就绪 | P3-P4 | mock 数据集降级 + 本地 stub CDC 事件 | | ClickHouse ReplacingMergeTree 去重延迟 | P4 | 查询加 FINAL / argMax 强制去重(02 §3.6 已设计) | | 单实例 CDC 消费者单点故障 | P4 | P6 演进为多实例 + Redis ExamCache;P4 阶段监控 consumer lag 告警 | | 掌握度算法精度不足 | P4 | v1 用加权滑动平均,P5+ 评估引入遗忘曲线 max 叠加(02 §9 已设计 MasteryMethod 枚举预留) |