grep -n 'Reset' -r . grep -n 'time.NewTicker' -r . go test -race -run TestTicker ./...
定时任务改成可动态调间隔之后,每改一次配置下一次就多跑一遍,跑两次之后又恢复正常,日志里同一批数据出现两条处理记录,下游还以为是自己重复消费了。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,Stop 之后再 Reset 才是干净的重新计时,直接在运行中的 ticker 上 Reset 会把已经排队的触发保留下来,通道里那条旧信号被下一轮循环读到,于是多跑一次。
「Ticker Reset 重复触发」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
处理上按这个顺序:重置之前先停止计时器并把通道里的信号排空;配置变更统一走同一把锁,避免并发去重置它;改完之后观察连续三次触发的间隔是否一致。
改完只确认一件事:连续修改五次间隔,每次只触发一次且间隔与配置一致,不再多跑。
