现象
我想让任务在 9 点、13 点、17 点、21 点各跑一次,第一反应是写一条规则、把小时写成 9,13,17,21。
结果:创建直接失败。
排查
试了几种写法都不行。最后确认原因是:这个调度的 RRULE 里 BYHOUR 不支持多值——一条规则只能挂一个整点。这不是我的写法错了,是调度器本身的限制。
解法
不要跟一条规则较劲,直接拆成多条任务:
拆开还有个额外好处:失败了能一眼看出是哪一段出的问题。如果用一条规则挂四个时间,你只能看到「今天失败了」,看不出是哪一次。
给做类似方案的人的建议:动手前先用极小成本试一条「多值时间」的规则,报错了就立刻改设计,别等到功能都写完才发现。
现象
这是最阴的一个坑。
我的任务是幂等的,逻辑是「先查今天签没签,没签就签」。但实测发现:明明已经签到成功了,状态查询接口仍然返回「今日未签到」。
排查
一开始我以为是缓存问题,隔了几分钟再查,还是返回未签到。但积分余额确实涨了——说明签到是成功的,只是状态查询字段不准。
如果继续按这个字段做判断,后果就是:补跑任务会以为「还没签」,反复去调签到接口。
解法
换判断依据:不看状态查询,看写入操作自己的返回码。
签到接口在「今日已签」时会返回一个特定的错误码。把这个错误码当成成功处理并跳过,幂等就成立。
改完之后,无论一天跑几次,行为都是稳定的:第一次真领,之后全部安静跳过。
这条经验可以推广:任何「每天只能领一次」的场景,幂等判断都应该建立在写入操作的返回码上,而不是独立的状态查询接口上。查询和写入之间永远有窗口期,而写入操作的错误码是权威的。
现象
连续几天,任务汇报都是「执行完成」。但我隐约觉得不对——积分好像没怎么涨。
查下来发现,任务实际上一直在失败,只是脚本把异常吞掉了,最后仍然输出了一句「完成」。
排查
这类问题的可怕之处在于它不会报错。日志里没有红字,任务列表里全是绿的,你会以为一切正常,然后连着断签好几天才发现。
解法
我在任务提示里写死了一条硬规则:
出现登录态失效、网络异常、业务错误码等情况,必须如实报告失败原因、修复建议和下一次重试时间,绝不允许输出「成功」。
另外让汇报信息「不对称」:
判断标准:如果一个自动化任务你从来没有收到过失败通知,先别高兴,去验证它到底有没有真的执行。没有失败的自动化,很可能是把失败藏起来了。
现象
配好之后我放心地关了几天电脑。结果那几天全是断签。
排查
定时任务是由客户端进程执行的。客户端没打开、或者机器关机,那个时段就不会执行。这不是 bug,是这类客户端的固有约束。
解法
两件事:
经验:凡是依赖本地客户端执行的定时任务,都要问自己一句「如果这一时段机器是关的,我有没有兜底方案」。没有的话,就要加冗余时段。
现象
旅行奖励的「到达时间」显示成一个大整数,我第一次看到时以为是时间戳单位搞错了,改动了好几次判断逻辑。
排查
那个字段确实是 Unix 时间戳,只是因为时区和显示口径的问题,换算出来跟我预想的不一致,导致我一度以为「任务时间算错了」。
解法
处理时间字段时,别靠心算。一律用程序换算后再判断,并且跟服务端的当前时间字段对齐比较——不要用本机时间直接对比,本机时间和服务端时间可能有时差。
经验:涉及时间的逻辑,永远只做两件事——要么用工具换算,要么用服务端给的时间做参照。心算时间戳是错误的重灾区。
现象
成长计划里有连续签到满 7 天 / 14 天 / 28 天的档位奖励。我以为「连续满 7 天,系统会自动发」。
结果:连续满 7 天之后,档位仍然是锁定状态。
排查
这类档位奖励是需要达标后主动领取的。达标只是解锁,不领就一直在那儿放着。
解法
把「领取档位奖励」也加进每日任务的执行清单里,并且做成只领达标且未领取的档位——已经领过的、还没达标的,都不发起操作。
这类设计的好处是:每天都会自动检查一遍,一旦哪天条件满足了,第二天就会自动领掉,不需要你盯着日历。
经验:盘点「每天该做的事」时,除了那些明确写着「每日」的入口,还要把「达标类」的奖励算进去。它们看起来是被动的,实际上是要你主动点的。
# | 坑 | 一句话教训 |
|---|---|---|
1 | 调度器不支持多时段 | 拆任务,别改写法 |
2 | 状态查询不可信 | 幂等看写入返回码,不看查询 |
3 | 失败被静默吞掉 | 没有失败通知 ≠ 一切正常 |
4 | 依赖客户端在线 | 冗余时段 + 最后一次要告警 |
5 | 时间字段误读 | 用工具换算,用服务端时间对齐 |
6 | 达标 ≠ 到账 | 达标类奖励也要主动领取 |
做完这六条修正之后,这套自动化我才真正敢「放着不管」。
如果你也在踩类似的坑,欢迎在评论区补充——尤其是第 3 条,我觉得是所有自动化任务里最值得警惕的一个。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。