数据库、对象存储与后台任务
把状态移出应用实例,才能安全重建和扩缩容
本地 Demo 经常把 SQLite、上传文件、队列和定时状态放在项目目录。生产环境一旦更换实例、滚动发布或水平扩容,这些隐含状态就会导致数据丢失、任务重复和不同实例看到不同内容。
| 状态 | 推荐位置 | 不应成为唯一副本的位置 |
|---|---|---|
账号、订单、业务记录 | 托管关系数据库或经过评审的数据库集群 | 容器文件系统、单机 SQLite |
用户上传与原始资料 | 私有对象存储 | Web 服务器上传目录 |
会话和短期缓存 | 受控缓存服务,允许过期和重建 | 应用进程内存作为唯一状态 |
长任务与重试状态 | 消息队列或持久化任务表 | 单进程内队列 |
模型输出缓存 | 有 TTL、租户隔离和数据分类的缓存 | 无期限普通日志 |
单人低流量工具可以从简单架构起步,但“简单”应意味着托管服务更少、责任更清晰,而不是没有备份、权限和恢复路径。
- 每次结构变更使用版本化迁移脚本,并在预生产数据副本演练。
- 发布窗口内保持前后版本兼容,优先使用“新增字段—回填—切换读取—移除旧字段”。
- 记录锁表时间、磁盘空间、执行耗时和失败后的停止条件。
- 在变更前取得可用恢复点,但不要把“有备份”当作脚本回滚方案。
- 发布后验证核心读写、约束、索引和后台任务,而不只看迁移命令退出码。
- Bucket 默认私有,浏览器通过短时、最小范围授权上传或下载。
- 服务端生成对象键,不直接信任文件名作为目录和权限边界。
- 限制类型、大小、数量和并发;高风险文件进入隔离扫描流程。
- 数据库保存对象标识和业务关系,不把永久公开 URL 当作唯一记录。
- 为误删、版本、归档和生命周期配置恢复策略,并测试对象级恢复。
任务至少要有稳定业务 ID、幂等键、超时、有限重试、退避、死信和人工重放入口。模型 API、邮件、支付和文件转换都可能产生费用或副作用,重试前必须判断操作是否安全。
定时任务在多个实例上运行时要避免重复调度。可以使用云调度服务、具有租约的任务系统,或明确只有一个调度者;不要假设“现在只有一台服务器”会永远成立。
- 托管数据库备份在隔离实例完成恢复和业务查询。
- 对象存储随机抽取文件验证内容、元数据、权限和版本。
- 队列重复投递不会生成两条订单或两次收费请求。
- 缓存全部清空后,核心业务仍能从权威数据源恢复。
继续阅读:数据库迁移、对象存储迁移和备份、恢复与版本回滚。
Built with