Files
Edu/docs/architecture/0010_architecture.md
SpecialX 2ba4250165
Some checks failed
CI Go / test (push) Has been cancelled
CI Proto / lint (push) Has been cancelled
CI Python / test (push) Has been cancelled
CI TypeScript / test (push) Has been cancelled
feat(p1): complete P1 foundation stage
- monorepo: pnpm workspace + go.work + pyproject.toml + commitlint/husky
- infra: docker-compose (minimal + full profiles) + init-sql + prometheus
- arch-scan: multi-language scanner skeleton (TS/Go/Python/Proto)
- shared-proto: buf v2 + classes.proto (ClassService CRUD contract)
- api-gateway: Go/Gin + JWT HS256 auth + reverse proxy + request ID
- classes: NestJS golden template (error system + observability + middleware + CRUD + tests)
- teacher-portal: Next.js + paper-feel UI design system
- CI/CD: 4 workflows (go/ts/py/proto)
- docs: migration guide + project_rules + coding-standards + git-workflow + ui-design-system + 004 + 9 module READMEs + known-issues + spec/plan migration + roadmap
2026-07-07 23:39:37 +08:00

175 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
抛开历史包袱和重构成本,如果我们站在 2026 年的上帝视角为一个支撑百万级日活、多端Web、App、小程序、高并发如全校同时交卷的 K12 教育生态系统设计企业级理想架构,那么整个系统必须走向 “领域驱动设计 (DDD) + 彻底的事件驱动 (EDA) + 读写分离 (CQRS) + 异构微服务” 的云原生架构。
以下是现代企业级最优架构的设计蓝图:
一、 现代企业级架构全景图
在这种规模下Next.js 不再充当“全栈巨石”,而是退化为纯粹的展示层 (Micro-Frontends) 和 BFF (Backend for Frontend)。
code
Mermaid
graph TB
subgraph ClientLayer["1. 多端访问层 (Micro-Frontends)"]
direction LR
MFE1[Teacher Portal]
MFE2[Student Portal]
MFE3[Parent App]
MFE4[Admin Console]
end
subgraph EdgeLayer["2. 边缘与网关层 (API Gateway & BFF)"]
WAF[WAF / CDN / 防火墙]
Gateway[全局统一网关 API Gateway<br/>Kong / APISIX / 鉴权 / 限流]
BFF1[Teacher BFF<br/>GraphQL]
BFF2[Student BFF<br/>GraphQL]
BFF3[Parent BFF<br/>GraphQL]
end
subgraph ServiceLayer["3. 领域微服务层 (Domain Services)"]
IAM[IAM 服务<br/>认证授权/RBAC]
CoreEdu[核心教学服务<br/>班级/排课/试卷/作业]
Content[教研内容服务<br/>教材/知识图谱]
DataAna[学情分析服务<br/>诊断/错题/成绩]
Msg[消息调度服务<br/>通知/短信/SSE长连接]
AI[AI 调度网关<br/>大模型接入/Prompt管理]
end
subgraph EventLayer["4. 事件驱动总线 (Event Data Platform)"]
Kafka[Kafka / Pulsar 集群<br/>统一企业级事件总线]
end
subgraph DataLayer["5. 异构存储与数据层 (Polyglot Persistence)"]
MySQL[(关系型主库<br/>分布式 MySQL/TiDB)]
Redis[(缓存/分布式锁<br/>Redis Cluster)]
ClickHouse[(分析型数据仓库<br/>ClickHouse / Doris)]
Neo4j[(图数据库<br/>Neo4j / 知识图谱)]
ES[(搜索引擎<br/>Elasticsearch)]
end
ClientLayer --> WAF
WAF --> Gateway
Gateway --> BFF1 & BFF2 & BFF3
BFF1 & BFF2 & BFF3 --> ServiceLayer
%% 服务与存储的交互
CoreEdu --> MySQL
IAM --> MySQL
Content --> Neo4j
DataAna --> ClickHouse
ServiceLayer --> Redis
%% CDC 与总线
MySQL -- "CDC (Debezium)<br/>捕获变更" --> Kafka
ServiceLayer -- "发布领域事件<br/>Outbox Pattern" --> Kafka
Kafka -- "消费事件" --> ServiceLayer
Kafka -- "同步读视图" --> ClickHouse
Kafka -- "索引同步" --> ES
二、 彻底解耦的四大核心设计模式
在最优架构中,系统通过以下企业级模式解决耦合问题:
1. 读写分离 (CQRS):解决“上帝模块”与复杂聚合查询
在当前的 Next_Edu 中Dashboard仪表盘需要查询所有模块。在企业级架构中写入逻辑和查询逻辑是完全物理隔离的。
Command (写) 链路:教师批改作业,请求只打到 CoreEdu 微服务,该服务只更新 MySQL 中的作业表,并迅速返回。
Query (读) 链路:系统背后通过 CDC如 Debezium监听 MySQL 的 binlog将数据变更实时推送到 Kafka。
物化视图构建DataAna (数据分析微服务) 消费 Kafka 消息,在 ClickHouse 或 ES 中构建一个高度扁平的“宽表”(如 student_dashboard_view
收益:前端 Dashboard 请求 BFF 时BFF 只查 ClickHouse 中的那一张宽表,毫秒级返回。没有 Join没有跨服务调用系统彻底解耦。
2. 发件箱模式 (Transactional Outbox):解决跨模块数据一致性
如果模块 A 成功了,模块 B 失败了怎么办?企业级系统绝对不允许跨服务的数据库事务 (如 2PC),因为会拖垮性能。
设计教师发布考试时CoreEdu 服务在同一个本地事务中做两件事:
往 exams 表写入考试数据。
往 outbox_events 表写入一条事件:{"type": "EXAM_PUBLISHED", "data": {...}}。
流转:后台的 CDC 组件Debezium监控到 outbox_events 表有新数据,自动将其投递到 Kafka。
收益:实现了 100% 保证的不丢消息的最终一致性。业务逻辑无需关心外部模块是否存活。
3. 编排与协同 (Orchestration vs. Choreography)
企业级架构处理复杂业务流(例如:考试创建 -> 智能组卷 -> 题目查重 -> 通知分发 -> 家长推送)必须区分两种模式:
协同 (Choreography - 基于事件):适用于低耦合业务。发完作业后,发出 HomeworkCreated 事件,通知服务、积分服务各自监听,互相不知道对方存在。
编排 (Orchestration - 基于工作流):适用于强状态依赖的业务。引入工作流引擎(如 Temporal 或 Camunda。由一个中央 Coordinator 负责指挥:“先调 AI 生成题目,成功后再调试卷服务,如果失败就执行补偿逻辑回滚”。
4. 前端微前端化 (Micro-Frontends)
后端的解耦如果不配合前端的解耦,依然是一场灾难。
设计:通过 Module Federation模块联邦或 qiankun将巨大的前端应用拆解。
收益:“排课组”的前端和后端可以独立发版,“题库组”的前端和后端可以独立发版。页面的组装在运行时由宿主框架完成。
三、 基础设施与扩展性设计
统一 API 网关 (API Gateway)
所有端点不再直接暴露。网关(如 Kong 或 APISIX负责统一的 JWT 鉴权校验、黑名单拦截、全局限流(防 CC 攻击)。业务微服务默认收到请求时,用户身份已经是合法的。
长连接与推送网关独立
SSE 或 WebSocket 不再由业务容器承载。设立专门的 Push Gateway 服务(底层可基于 Go 或 Netty 编写,单节点支撑十万级连接)。业务服务只需往 Redis Pub/Sub 或 Kafka 发送消息Push Gateway 负责广播给对应连接的客户端。
异构存储 (Polyglot Persistence)
知识图谱:教材和知识点的层级不再强行用 MySQL 存储,改为 Neo4j图数据库在执行“求某知识点的前置知识树”时性能提升百倍。
错题本/诊断:这些包含海量日志和时序数据的业务,直接存入 ClickHouse列式数据库亿级数据聚合秒级返回。
题库检索:题目内容实时同步到 Elasticsearch支持分词、拼音、公式模糊全文搜索而不是 MySQL 的 FULLTEXT。
四、 对比:为什么这是“最优”?
维度 当前的单体/模块化 (Next_Edu V3) 现代企业级架构 结果差异
模块依赖 物理隔离,但代码级强引用 (import) 纯事件通信与 API 契约 任意微服务宕机/重构,完全不影响其他服务
聚合查询 并行查 5 个模块的 DB 再在内存拼装 后台预计算,直接查 ClickHouse 宽表 Dashboard 响应从 1.5s 降至 50ms
技术栈绑定 全部被绑死在 TypeScript + Next.js 异构。AI网关用Python高并发网关用Go 能够根据业务特性选择最优技术
实时推送 Next.js SSE连接数多了容易爆内存 独立的 Push Gateway + Redis PubSub 支持全校十万人同时在线答题的广播推送
容灾与扩容 只能整个应用一起扩容 核心教学扩 50 个 Pod后台审计缩至 1 个 Pod 资源利用率极高,抗高并发能力呈指数级提升
总结
企业级架构的本质是承认分布式环境下的不完美,用基础设施的复杂性来换取业务代码的简单性。
业务模块不再需要操心“谁要我的数据”、“如何拼装别人的数据”、“事务失败怎么回滚”。它们只做一件事:接收指令 -> 改变自身领域模型 -> 将改变广播给全宇宙Event Bus.
蓝图设计的合理性(几乎全对,但有几个地方需要微调)
1. 各层选型精准,但有一处“过度理想”
API Gateway + BFF + GraphQL
Gateway 做统一鉴权限流BFF 做面向前端的聚合GraphQL 允许不同端按需取数——这在多端下非常正确。
✅ 唯一需要警惕的是 GraphQL 的 N+1 和深度嵌套,必须在 BFF 层用 DataLoader 批量化解,否则可能引入严重的下游放大调用。
事件总线选 Kafka/Pulsar
对业务事件和 CDC 均用同一总线,完全可行。
✅ 建议明确划分 领域事件 topic 与 数据同步 topic两者消费模型不同业务事件可能需回溯、重试数据同步更适合顺序日志在企业级通常用不同集群或至少独立 namespace。
CQRS + CDC + ClickHouse 宽表:
这是“彻底解耦聚合查询”的王道方案。
⚠️ 但实时性要谨慎定义:从 MySQL binlog → Kafka → 消费者写入 ClickHouse一般有 1-5 秒延迟。对于需要实时成绩展示的场景,可能需要 BFF 支持“查询主库 + 降级宽表”的混合读。
⚠️ ClickHouse 宽表可能会变得非常庞大列特别多需要设计好聚合引擎表SummingMergeTree / AggregatingMergeTree和合理的分区键如按学校+日期),否则维护成本极高。
图数据库 Neo4j 用于知识图谱:
正确,前置依赖查询性能会远远优于 MySQL 递归 CTE。但也要考虑知识图谱写入频率低、读频率高Neo4j 单机足够,如果为了运维一致性,也可以用 PostgreSQL + Apache AGE 插件,但你的蓝图用 Neo4j 没问题。
Push Gateway 独立 + Redis Pub/Sub
十万级连接通过独立长连接服务处理,是正确的。
✅ 注意Redis Pub/Sub 不持久化,如果有消息可靠性要求(离线再上线收不到历史推送),需要引入一个持久化队列或消息主题,由 Push Gateway 消费后推送给在线用户,同时标记已读。
2. 四大核心模式评价
CQRS正确这是消除“上帝模块”的根本解。
Transactional Outbox + CDC
这是 唯一能保证最终一致性的分布式事务方案,比 2PC 和 Saga 都更适合高并发教育场景。
✅ 但要注意Outbox 表必须随业务服务独立部署CDC 连接器Debezium需要监控其心跳和落后量否则可能成为链路瓶颈。
Choreography vs Orchestration
你提到用 Temporal/Camunda 做编排,这非常对。
⚠️ 但要小心:“考试创建 → AI组卷 → 查重 → 通知分发”这类流程,如果使用全事件协同,会出现隐式状态机,维护复杂。用 Temporal 作为工作流引擎是明智的Temporal 本身已经内置了重试、补偿、超时,比自研编排器强得多。
微前端:
在多团队并行开发下必要,但教育产品交互一致性要求高,需要强约束的设计系统和跨应用状态共享机制(如通过 BFF 或客户端共享 token + 用户上下文)。模块联邦 + 统一 UI 库是标配。
3. 基础设施层的一个潜在疏漏
你提到了 WAF、Gateway、Kafka、异构存储但没有提到统一的配置中心与服务发现如 Consul/Nacos/K8s Service。在微服务体系下服务动态扩缩容、配置热更新如限流阈值、功能开关必须同步规划否则运维会变得困难。这一层通常与 Service MeshIstio配合可以在架构图中补上。