# data-ana 数据分析服务 > 版本:0.1(骨架) > 日期:2026-07-07 > 状态:P4 待交付 > 关联文档:[架构影响地图](../../architecture/004_architecture_impact_map.md) --- ## 1. 模块职责 data-ana 是数据分析限界上下文(Python 实现),管理 Report、Mastery、Dashboard 聚合。 消费 core-edu 与 content 的领域事件,构建 ClickHouse 学情宽表,计算知识点掌握度。 对外提供学情仪表盘查询、班级/年级/学校维度报表、个性化推荐数据支撑。 --- ## 2. 技术栈 | 类别 | 技术 | 版本 | 用途 | |------|------|------|------| | 语言 | Python | 3.12+ | 数据分析 | | 框架 | FastAPI | 0.110+ | 异步 API | | ORM | SQLAlchemy | 2.x | ClickHouse 查询 | | 分析库 | ClickHouse | - | 学情宽表、实时聚合 | | 任务 | Celery | 5.x | 异步计算任务 | | 校验 | pydantic | 2.x | 运行时校验 | | 追踪 | OpenTelemetry | - | 分布式追踪 | --- ## 3. 架构图 ```mermaid graph TB BFF[BFF 聚合层] -->|gRPC| ANA[data-ana 服务] K[(Kafka)] -->|消费事件| ANA ANA --> PROJ[Projection
事件 → ClickHouse] ANA --> CALC[MasteryCalculator
掌握度计算] ANA --> RPT[ReportGenerator
报表生成] ANA -->[(ClickHouse
学情宽表)] ANA -.事件.-> K2[(Kafka
edu.insight.mastery.updated)] ``` > 待 P4 交付时补充完整的分层架构图与事件消费管线图。 --- ## 4. 核心流程图 ```mermaid sequenceDiagram participant K as Kafka participant ANA as data-ana participant CH as ClickHouse participant BFF as BFF K->>ANA: edu.teaching.grade.recorded ANA->>ANA: Projection 写入宽表 ANA->>ANA: 触发掌握度计算(Celery) ANA->>CH: 更新 mastery 表 ANA->>K: 发布 edu.insight.mastery.updated BFF->>ANA: gRPC GetDashboard(studentId) ANA->>CH: 查询宽表聚合 ANA-->>BFF: DashboardDTO ``` > 待 P4 交付时补充:报表生成流程、掌握度算法流程、CDC 同步流程。 --- ## 5. 对外契约 - **gRPC 服务**:DashboardService、MasteryService、ReportService(待 P4 定义 protobuf) - **消费事件**:`edu.teaching.*`、`edu.content.*` - **发布事件**:`edu.insight.mastery.updated` - **ClickHouse 宽表**:student_wide_table、mastery_table、exam_analysis_table > 待 P4 交付时补充完整 protobuf 定义与宽表 schema。 --- ## 6. 依赖关系 - **上游**:teacher-bff、student-bff、parent-bff、ai(gRPC 查询学情) - **下游**:ClickHouse、Kafka(消费与发布)、Celery(异步任务) - **跨服务**:消费 core-edu/content 事件;发布掌握度事件被 core-edu 消费触发推荐 --- ## 7. 架构约束 1. 查询必须走 ClickHouse 宽表,禁止实时计算 2. 事件消费必须幂等,基于 event_id 去重 3. 掌握度计算必须异步(Celery),不阻塞事件消费 4. 宽表查询响应时间 ≤ 5 秒 > 待 P4 交付时补充完整约束清单。 --- ## 8. 架构决策 > 待 P4 交付时补充 ADR 记录,预计包括:Python+FastAPI 选型、ClickHouse 选型、Celery 异步框架选型、掌握度算法选型。