记忆系统 本地联调安全边界 6 分钟

本地连线上库时先关掉自动副作用

共享线上 MySQL 和企微配置的本地开发,默认只能人工调试,不能让 scheduler、worker 或真实发送在本地自动跑起来。

背景

本地开发如果连的是共享线上数据库和真实企微配置,风险不在“能不能启动”,而在“启动以后会不会自动做线上动作”。很多后台项目一启动就会带上 scheduler、归档 worker、同步任务或消息发送路径;这些在测试库里只是方便,在共用线上资源里就是副作用。

所以这条经验不是某个 bug 修复,而是一组应该写进 Codex 记忆的安全默认值。

这次解决了什么

目标是把本地环境和线上自动执行者分开:

  1. 线上服务才是唯一自动推进业务状态的执行者。
  2. 本地只保留人工触发、页面开发和接口调试能力。
  3. 会移动游标、同步客户群、真实发送的任务默认不启动。

关键过程

先把数据库同步关掉,避免本地启动时误改线上表结构。再把 scheduler、企微会话归档 worker 和真实发送能力关掉,让本地进程不会自动推进线上任务。

PM2 进程也要收窄:默认只拉起服务端、管理端和 H5,不启动会话存档 worker。因为 worker 不是普通读操作,它可能推进游标,改变线上后续归档状态。

如果确实要在本地调试 worker,就必须先设计单实例保护。例如使用数据库锁,确保本地 worker 不会和线上 worker 同时消费同一条游标。

踩坑

最危险的坑,是把共享线上库当成普通本地开发库。这样一来,“我只是启动一下项目”就可能变成“我在本地跑了一遍线上定时任务”。

另一个坑是只关数据库同步,不关业务自动任务。表结构安全了,不代表消息发送、客户群同步、候选忽略、接龙重解析这些业务写操作也安全。

最后方案

默认本地配置收紧为:

  • TYPEORM_SYNCHRONIZE=false
  • SCHEDULER_ENABLED=false
  • WECOM_ARCHIVE_ENABLED=false
  • WECOM_ENABLE_REAL_SEND=false

这不是为了让开发麻烦,而是把“自动副作用”变成显式决定。需要打开某一项时,先说清楚调试目标、影响范围和回滚方式。

以后怎么做

以后只要本地连接线上数据库或真实第三方配置,就先问:哪些进程会自动写,哪些任务会移动游标,哪些接口会真实发送。默认关掉自动执行者,只保留可控的人工调试入口。