mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-07 17:08:33 +08:00
仓库里所有周期任务都用 tryAcquireSingletonLeaderLock 选主、只让一个实例跑 (ops:*、dashboard:aggregation、subscription:expiry、payment:order:expiry 等), 唯独定时备份 runScheduledBackup 没接这套锁,每个实例都自己跑一遍。 多实例部署下同一时刻: - 同一个库被 N 次 pg_dump; - 内存峰值 ×N —— 归档整个读进内存再上传,内存吃紧的节点会直接 OOM; - 上传的是同一个带时间戳的 key,N 份互相覆盖,白干一场连多余副本都留不下。 实测 3 节点:每天 backup_records 里三条一模一样的记录(同 key、同大小)。 改动:把 BackupService 接进和其它任务一样的 tryAcquireSingletonLeaderLock (key=backup:scheduled:leader)。只锁定时备份,手动备份(CreateBackup/ StartBackup)不锁;无协调后端(cache/db 均 nil)时不加锁照常跑,单机/单测 行为不变;锁 TTL 35m > 备份自身 30m context 上限,防止大库 dump 中途锁过期。 wire_gen.go 由 wire 重新生成。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>