参考系统架构

一个生产系统,
公开展示其构建与运行。

这是 Nathaniel Jay Adams 为自己的教学亲自设计、构建并运营的系统。它不是大学部署,也不作为大学部署对外提供——而是上文所述数据架构、集成规范与运营标准的一个实际运行示例。

观看系统架构短片

动画图示由 WorldWise Learning 根据系统自身的数据结构和调度配置制作。主持人 Minh 是使用 Google Vids 制作的 AI 虚拟形象,配有 AI 语音。片中不展示任何真实记录、学生数据或指标。 数据中心背景为 AI 生成的图片。

系统如何逐步构建

  1. 问题

    同时在多个项目中授课,每周都会产生同样的负担:记录分散在各类文档中,进度靠手工追踪,也没有任何地方能完整查看一个学期的证据。

  2. 系统架构

    一个服务端渲染的应用,托管在云平台上,底层为关系型数据库,从源代码管理持续部署,且只有通过身份验证才能访问。架构本身即与供应商无关:真正的资产是数据模型,而不是服务提供商。

    应用
    Next.js 16 · React · TypeScript
    数据
    PostgreSQL(通过 Prisma)· 经 Zod 校验的边界
    运行时依赖
    12个,刻意精简
    访问方式
    需身份验证;无公开访问入口
  3. 构建了什么

    一个由十张数据表构成的领域模型,覆盖整个教学运营而非单一功能,并在其上设有用于每周规划的指挥中心。

    • 学生 · 教师 · 课次 · 资料
    • 评估 · 付款
    • 源文档 · 审核队列
    • 集成健康状态 · 定时运行历史
  4. 数据集成与人工智能准备度

    两项定时任务每天运行:日历事件被核对整合为课次记录,教学记录被镜像同步到 Notion。另有一个独立的本地源文件流程,按内容哈希追踪文件,因此文件的变更、重复和消失都能被检测出来,而不是凭推测判断。

    该系统不调用语言模型,这是有意为之。源文档追踪和人工审核队列,恰恰是基于检索的助手所需要的依据与监督基础。数据规范先行;只有在证据支持时,才会在之后加入模型。

  5. 实际运行

    它按计划在无人值守的情况下运行,是实际投入使用的基础设施,而非演示。调度器只保证小时级精度,也不会重试失败的调用,因此设计同时接受这两点:两项任务的启动时间窗口相隔一小时(并非以完成为前提的依赖关系),每次运行都会被持久记录,错过的运行会被明确呈现,而不是想当然地视为已完成。定时请求均经过身份验证,一旦缺少密钥即以“失败即关闭”的方式拒绝执行。凭据过期、主机权限和第三方 API 变更引发的故障,均已在生产环境中诊断并修复——这正是原型中永远不会出现的部分。

  6. 证据

    图示均由系统自身的数据结构和调度配置生成。
    其中不含任何学生、教职人员或院校数据。

    实践中的架构
    一个系统,从教学到证据教学记录由定时任务更新。运行历史和连接器健康状态让结果可供核查。这些路径表示流程走向,而非数据库外键。
    01 / 架构

    两个层面,
    一个系统。

    教学是实际发生的过程,
    运营层面保存证据。

    教学核心 教学关系Lesson 与 Student、Instructor、Material 和 Assessment 相连。Student 还与 Assessment 和 Payment 相连。Payment 与 Lesson 没有直接关系。
    学生学习者
    教师教育工作者
    课次学习体验
    评估学习进展
    资料教学资源
    付款学费账单
    运营层面
    SourceDocument 源文件ReviewItem 审核队列IntegrationHealth 连接器健康状态CronRun 运行历史
    查看架构证据

    六个教学模型,四个运营模型。课次(Lesson)隶属于一名学生(Student)和一名教师(Instructor);资料(Material)为可选项。评估(Assessment)隶属于学生,并可关联课次。付款(Payment)隶属于学生,而非课次。

    ReviewItem 可关联 SourceDocument。IntegrationHealth 和 CronRun 是相互独立的数据表。两个层面是概念上的分组,而非数据库关系。

    02 / 自动化

    两项每日任务,
    刻意安排的先后顺序。

    先导入日历,
    再将教学记录镜像同步出去。

    11:00 UTC日历 → 课次
    1. 日历
    2. 核对整合
    3. 课次
    间隔1小时
    12:00 UTC教学记录 → Notion
    1. 数据库
    2. 同步
    3. Notion
    每次经授权的任务调用
    都会创建一条 CronRun 记录。
    查看调度证据

    0 11 * * * → /api/cron/daily-sync
    0 12 * * * → /api/cron/notion-sync

    两项任务的启动时间窗口相隔一小时;完成顺序并不固定。中午的任务会将学生、教师、课次、付款和评估记录镜像同步到 Notion。

    源文件哈希与审核是一个独立的本地流程,不属于中午运行的云端任务。请求必须携带 cron 密钥;未经授权的请求会在创建运行记录之前被拒绝。

    03 / 可观测性

    任何故障
    都不会悄无声息。

    查看运行了什么、哪些成功,
    以及哪些需要处理。

    1. 运行任务开始
    2. 已记录历史已保存
    3. 健康状态已更新连接器状态
    4. 故障已显现需处理事项清晰可见
    运行历史任务 · 时间 · 结果 · 错误CronRun
    连接器健康状态健康状态 · 最近同步 · 最近错误

    连接器可以访问,并不能证明定时任务已成功运行。两种信号都很重要。

    查看可观测性证据

    CronRun
    job · startedAt · finishedAt · ok · error · trigger

    IntegrationHealth
    healthy · lastSyncAt · lastError

    状态为推导得出,而非存储的健康字段:ok、failed、missed、blocked、none。“missed”表示最近一次成功运行已过时,并非实测计数。连接器健康状态由 Notion 集成单独持久化保存,与运行是否完成相互独立。

    此处展示的是记录机制的设计,并非实时监控,也不保证能防范所有基础设施故障。图中未展示任何示例记录或虚构指标。

    架构图源自系统源代码与配置,不含实时记录。理解系统,查验证据。

  7. 可迁移性

    这一模式可原样迁移到院校工作中:明确定义的数据模型、定时运行的核对整合流程、在人工审核下有据可依的辅助,以及经得起真实故障考验的可观测性。对大学而言,变化的是治理、规模以及审核环节所处的位置——而不是架构本身。

返回实践中的系统 洽谈您的项目