旧系统重构YUEXIAN INSIGHTS

迁移定时任务,先管住重复执行和业务时间

盘点旧系统后台作业,明确时区、触发条件、并发策略、幂等边界、任务主责和迁移后验收,避免升级时漏跑与重复处理。

本文目录
先看结论

调度器触发成功,不代表业务任务正确完成

迁移后台任务先建立清单,记录触发源、时区、业务周期、资源依赖和副作用,再确认并发与重跑策略。调度系统可能漏触发或重复触发,任务要能识别业务周期与已处理结果。新旧环境不能同时自由调度同一任务;通过受控切换建立唯一主责,验收检查处理对象、结果、失败补偿和周期覆盖,而不只看任务状态显示成功。

任务类型对应不同保护

任务应采用的控制易出现的问题
报表与只读聚合以业务周期标识结果,明确生成口径与重算规则时区或截止时间变化导致同名报表内容不同
同步与通知按对象与事件记录处理结果,区分查询和发送重复重试造成多次发送或覆盖新数据
结算与状态推进使用持久化业务标识、受控并发和可审计补偿任务中断后不知道哪些对象已执行,人工重跑产生重复业务
01

发现所有任务触发源,清单不能只来自应用代码

旧任务可能存在系统 crontab、数据库作业、容器平台、应用内部调度、办公脚本和第三方控制台。每个触发源都应纳入接手与迁移。

记录任务名称、用途、负责人、运行账号、执行环境与调用命令,再补充输入来源和输出位置。月末、年末与人工触发的作业需要业务确认,近期没有日志不能证明不存在。特别留意同一任务在多个机器上被复制配置的情况,新平台接管前先说明当前实际由谁触发。

  • 逐环境核对系统、应用、数据库与外部平台的调度配置。
  • 记录执行频率、最长周期和人工补跑入口。
  • 把无负责人或用途不明的任务列入待确认清单。
02

区分触发时间与业务数据截止时间

每天零点触发不等于处理前一天的全部数据。要明确时区、统计区间、迟到数据、节假日与人工重算的口径。

将业务周期作为输入,而不是每次执行都按“当前时间减一天”推算。这样任务延迟后仍知道原本要处理哪个周期。不同调度器对时区、漏触发和夏令时的支持不同,应按目标产品文档确认;即使只面向中国业务,也要检查服务器时区与应用格式是否一致。

依赖上游文件或同步结果的任务,还要区分到达时间与是否完整。可通过清单、完成标志或其他约定判断数据准备好,超时进入明确处理流程。单纯每天固定时间开始读取,可能把未完成的数据当成正式结果。

  • 规定业务时区、区间开闭边界与数据截止规则。
  • 为迟到数据与跨周期修正定义重算或补偿方式。
  • 测试延迟触发、手动补跑和重复周期输入。
03

将幂等保护放在业务处理边界

调度层锁可以减少同一任务重叠,但不能独立保证每条业务只处理一次。实际写入、发送和状态变化应有持久化识别方式。

任务按稳定对象与业务周期确定处理标识,执行前后记录状态及结果。外部发送超时可能已经成功,重试前需要根据接口能力查询或去重。仅在内存中标记“处理过”会在重启后丢失;全任务加一个大锁也无法解释中途失败的位置。保护应与具体副作用的可重复能力相匹配。

  • 明确业务去重标识、保留时间和冲突处理。
  • 记录成功、失败和不确定结果,支持按对象调查。
  • 模拟中断与超时,验证重跑不会重复产生副作用。
04

重叠、漏跑和资源使用分别设策略

上一轮尚未结束时,新一轮可以跳过、排队或并行,选择取决于业务。并发策略只是调度行为,最终数据正确性仍由任务负责。

目标平台通常有并发、截止时间和历史记录等配置,但语义需按平台版本确认。比如 Kubernetes CronJob 的并发策略针对同一 CronJob,不是全系统业务去重;Celery 周期调度也需要避免多个调度器重复发任务。为任务设批次、资源上限和执行进度,避免迁移后全部作业在同一时刻争用数据库。

  • 定义重叠执行、漏触发与长时间运行的处理。
  • 调整批次、频率和错峰方式,并观察依赖资源。
  • 保留任务进度、耗时与业务失败数量的记录。
05

迁移按演练、关闭旧触发与启用新触发推进

先在脱敏或隔离环境验证任务,再确定最后一个旧周期与第一个新周期。只有调度主责清楚,才能解释切换附近是否漏跑或重跑。

演练应使用固定业务周期,检查输入对象、输出结果及副作用。切换时停止旧触发并核对仍在执行的实例,记录处理边界后启用新触发。新平台不宜靠影子运行再次发送通知或修改真实状态;可把计算与副作用拆开,仅比较计算结果。切换后的首个周期由负责人检查,不依赖任务绿色状态。

  • 第一步:用固定周期运行并比较业务结果。
  • 第二步:关闭旧触发,确认活跃任务与处理进度。
  • 第三步:启用新调度,核对首周期及失败补跑。
06

按业务结果交接运行手册与补跑权限

运维人员需要知道如何定位未处理对象、如何安全补跑,以及什么时候必须由业务负责人确认。任务脚本交付只是其中一部分。

本文适合周期性后台作业升级,不替代在线交易或大规模数据迁移方案。长周期结算应覆盖完整周期或明确采用何种验证证据;无法等待时,把剩余核验事项和责任写入阶段验收。业务成功数量、错误明细和输出对账应有可靠证据,日志不要记录不必要的敏感内容。

补跑工具应要求明确周期与对象范围,提供执行前的影响确认和执行后的结果清单。维护人员需要能够区分“未执行”“执行失败”和“结果不确定”,不同状态采用不同处理,不把整批重跑作为唯一按钮。

  • 交付触发配置、周期定义、依赖和处理标识说明。
  • 演练指定周期补跑、暂停与失败对象隔离。
  • 为重要作业定义业务告警与责任人确认方式。

需求讨论中的问题

调度平台显示成功,是不是迁移验收就通过?

还需检查任务处理对象和业务结果。进程退出成功可能只是没有抛异常,不代表通知已发送、同步已完整或结算口径正确。

加分布式锁能保证任务只执行一次吗?

它能限制某些重叠,但任务中断、锁失效和外部请求超时仍可能造成重复业务。还需在实际副作用边界设计持久化去重与状态记录。

新旧任务同时运行几天便于对比吗?

计算结果可以在隔离副作用后对比;写入、发送和结算不能自由执行两次。正式调度应有唯一主责。

带走这份清单

后台任务迁移验收清单

可逐项勾选,辅助本次阅读;刷新页面后不保留。

参考资料

技术概念可进一步阅读以下资料;文中的业务场景与实施清单用于方案讨论。

  1. Kubernetes Documentation · CronJob

    核对近似调度、幂等任务、并发策略、漏触发与时区配置的官方语义。

  2. Celery Documentation · Periodic Tasks

    核对单调度器要求、周期任务重叠与时区处理的注意事项。

#定时任务#调度迁移#幂等处理#业务周期
从阅读,到行动

准备把旧后台任务迁移到新平台?

提供任务清单、调度来源、业务周期与副作用类型,月弦科技可以帮助设计迁移边界与补跑验收。