凌晨促销同步执行了两遍,外部系统收到两次推送。排查时先别把责任全推给“Magento Cron不可靠”,我会按时间线还原:

  1. 两条记录是否拥有不同的 schedule_id?
  2. 两台机器是否在同一秒启动?
  3. 第一次是否仍在运行,第二次就开始了?
  4. 外部接口是否因超时重试,而服务端其实已处理成功?
SELECT schedule_id, job_code, status, created_at,
       scheduled_at, executed_at, finished_at, messages
FROM cron_schedule
WHERE job_code='vendor_sync'
ORDER BY schedule_id DESC LIMIT 20;

三种常见根因

系统crontab重复:同一节点被 root 与 Magento 用户各配置一份,或旧发布目录的任务没有移除。

锁不共享:两台节点使用本地文件锁,各自都认为自己拿到了锁。多节点应使用项目支持的共享锁后端,并确认节点连接到同一数据库/Redis。

任务超过调度间隔:上一轮还没结束,下一轮又被标记为可执行。任务需要合理的超时、批次和互斥,而不是单纯把执行频率调低。

业务动作必须自己幂等

即使调度层只有一次,网络超时也可能触发重试。向 ERP 推送订单时应带稳定的业务键,让接收方识别重复;发送优惠券、扣款和库存更新更不能依赖“Cron理论上只跑一次”。

修复后连续观察至少两个完整调度周期。对照主机名、PID、schedule_id 和业务键,确认第二个进程拿不到锁时会安全退出,并且人为重放同一任务不会产生第二份业务结果。