grep -n 'Reset' -r .
grep -n 'time.NewTicker' -r .
go test -race -run TestTicker ./...

定时任务改成可动态调间隔之后,每改一次配置下一次就多跑一遍,跑两次之后又恢复正常,日志里同一批数据出现两条处理记录,下游还以为是自己重复消费了。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,Stop 之后再 Reset 才是干净的重新计时,直接在运行中的 ticker 上 Reset 会把已经排队的触发保留下来,通道里那条旧信号被下一轮循环读到,于是多跑一次。

「Ticker Reset 重复触发」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

处理上按这个顺序:重置之前先停止计时器并把通道里的信号排空;配置变更统一走同一把锁,避免并发去重置它;改完之后观察连续三次触发的间隔是否一致。

改完只确认一件事:连续修改五次间隔,每次只触发一次且间隔与配置一致,不再多跑。

作者 9823189