想象一下,你正在教别人用 Postgres。给学员扔一段代码,让他盯着屏幕看,是浪费时间。他们真正需要的,是一个可以随便折腾、搞坏了也不心疼的数据库。
这就是 DevOps Daily Pro 付费学习平台背后最重要的设计逻辑:每个学员拿到一个真实可用的 PostgreSQL 数据库,在上面跑真实 SQL,练完就扔。
![]()
产品要的三样东西
一个托管 Postgres 实例给不了他们想要的东西。平台需要的基础能力有三条:
第一,廉价、快速、互相隔离的数据库。一个 lab 就是一个只活二十分钟的数据库。每次练习都给学员开一个新实例,太慢也太贵。Neon 的分支功能(branching)可以基于一个预置好数据的父库,做写时复制(copy-on-write)克隆,几秒钟内就能给学员开出一个独立库。
第二,不能压在我们 Web 服务器上的慢任务。AI 生成内容要花几十秒。Neon Functions 可以把这类计算放在数据库旁边跑,平台自己不用再运维一套消息队列和 worker 集群。
第三,不用再引入一家 AI 厂商。Neon 的 AI Gateway 提供 OpenAI 兼容端点,调用模型只需要改一个 base URL 和一把 key,不需要做新的集成。
诚实版本
这些话听着像在吹 Neon,但团队也承认:这套系统用普通 Postgres 加一个消息队列再加容器平台,也能搭出来。只是要花更长时间,而且之后要自己运维更多组件。Stripe 在这个架构里是并排存在的,不嵌在核心链路中,后面会单独说。
代码库里最重要的一条规则
整个项目里最值钱的一条规矩是:学习者的进度数据,永远不存放在即将被删除的东西里。
一个 lab 分支里放的是电商风格的 schema,供学员查询。但它不存放"学员完成了第四课"这样的记录。那条记录是主 Postgres 数据库里的一行数据,通过 Prisma 写入,即使三十秒后分支被销毁,进度依旧还在。
这条规则写下来显得理所当然,但做错很容易。当学员面前已经摆着一个数据库时,最省事的做法就是顺手把进度也记在里面——这正是团队刻意避开的坑。
其他数据全都放在一个关系库里
除了进度之外的东西,全部是关系型数据,集中存放在一个地方:从 Auth 镜像过来的用户数据、订阅、生成的试题集和问题、测验结果、面试会话与作答记录、XP 和经验成就、证书、lab 会话元数据、后台审计记录。
团队有意不把这些数据拆到各种专用存储里。学习者的进度天然充满 join:这个用户看过哪些问题,哪些问题到了复习时间,哪些作答记录属于某个会话、某个学习路径——这些关联本身就是产品的全部价值。而 Postgres 恰恰擅长 join。
身份认证怎么处理
Neon Auth 是身份的唯一事实来源。Next.js 应用通过一个 catch-all 路由,把所有认证调用(登录、注册、会话、登出等)代理转发给 Neon Auth,应用层不直接持有认证逻辑。
这套架构谈不上多惊艳,但它的取舍很清楚:把"会消失的练习环境"和"不能消失的学习记录"彻底分开,用分支解决成本问题,用主库解决数据问题,剩下的交给 Postgres 的 join。教学平台上最贵的工程投入,也正好花在了学员真正需要的东西上——一个可以放心搞坏的数据库。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.