Temporal 1.24 的 Go worker 升级代码后,历史工作流一重放就报 non-deterministic workflow,worker 直接 panic,卡住 40 多个未完成的订单流程,新起的流程却完全正常。

一开始怀疑是「用了 map 遍历,顺序不稳定」,查了一圈,方向不对。

把日志和配置对完,能解释这个现象的基本就这几处。工作流代码里加了 time.Now 或随机数。少数情况下是活动调用顺序被调整,历史事件对不上。

少数情况下是版本分支没加 GetVersion,新旧代码走同一路径。

第一件事是用重放测试跑历史事件

go test ./workflow -run TestReplay -count=1

再往下把时间与随机数替换成 workflow.Now 和 SideEffect

grep -rn 'time.Now\|rand.' workflow/

给改动分支加 GetVersion 标记

python -c "print('v := workflow.GetVersion(ctx, \"order-v2\", workflow.DefaultVersion, 2)')"

等前面都确认过,再用旧历史文件在本地 worker 重放验证

temporal workflow replay --workflow-id order-10086 --namespace default

改完先别撤,确认这几项。重放测试通过,历史工作流在 worker 上能继续推进,日志里不再出现 non-deterministic workflow,卡住的订单数降到 0。

Temporal 要求工作流代码可重放,任何外部不确定性都会破坏事件匹配;升级时先跑 replay 测试,比在生产上等 panic 要便宜得多。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189