共计 2084 个字符,预计需要花费 6 分钟才能阅读完成。
典型故障案例引发的思考
去年我们电商系统遇到一个经典问题:用户支付成功后,订单状态却显示未支付。排查发现是库存服务更新成功后,通知订单服务的消息丢失了。这种因工作流中断导致的状态不一致,在手动编排的系统中频繁发生。

更棘手的是会员积分兑换场景:当第三方兑换接口超时时,系统既不能重复扣减积分,又需要保证最终完成兑换。传统方案通过数据库事务 + 定时任务补偿,代码复杂度呈指数级增长。
为什么选择 Cadence
对比常见方案:
- Airflow 的 DAG 虽然可视化好,但缺乏强一致性保证
- Temporal 的 Activity 重试机制类似,但缺少内置补偿事务
Cadence 的核心优势在于:
- 持久化执行历史:所有步骤记录在内部数据库,崩溃后可从断点恢复
- 同步编程模型:开发者用普通代码写业务流程,框架自动处理异步通信
- 补偿 API 原生支持 :通过
continueAsNew实现工作流版本迁移
技能脚本开发规范
基础 DSL 结构
# 订单创建工作流定义
name: OrderProcessingWorkflow
timeout: 1h
actions:
- type: activity
name: ReserveInventory
retry:
initial_interval: 1s
max_interval: 1m
backoff_coefficient: 2.0
compensation: CancelInventoryReservation # 补偿动作
关键参数说明:
backoff_coefficient:指数退避系数,建议设置在 1.5-2.0 之间compensation:必须定义等幂操作,建议采用业务 ID+ 操作类型作为幂等键
错误处理模板
Go 语言实现的重试策略:
func ProcessPayment(ctx context.Context, orderID string) error {
retryPolicy := &cadence.RetryPolicy{
InitialInterval: time.Second,
BackoffCoefficient: 1.5,
MaximumInterval: time.Minute,
ExpirationInterval: time.Hour * 24,
}
options := workflow.ActivityOptions{
ScheduleToStartTimeout: time.Minute,
StartToCloseTimeout: time.Hour,
RetryPolicy: retryPolicy,
}
ctx = workflow.WithActivityOptions(ctx, options)
return workflow.ExecuteActivity(ctx, payments.Process, orderID).Get(ctx, nil)
}
动态工作流调整
通过 Signal 修改运行中工作流的示例:
// 定义 Signal 处理器
public interface OrderUpdateSignal {
@SignalMethod
void applyDiscount(String discountCode);
}
// 在工作流中处理
public void processOrder(Order order) {Workflow.registerListener(new OrderUpdateSignal() {
@Override
public void applyDiscount(String discountCode) {order.applyDiscount(discountCode); // 实时生效
}
});
// ... 原有流程逻辑
}
生产环境检查清单
版本兼容方案
- 每次修改工作流定义必须新增
workflowType版本号 - 使用
GetVersion()API 处理新旧逻辑分支:
if workflow.GetVersion(ctx, "AddRefund", workflow.DefaultVersion, 1) == 1 {// 新版本退款逻辑} else {// 旧版本兼容路径}
监控关键指标
- 决策任务超时率:反映工作流复杂度是否过高
- 活动重试次数:突增往往预示下游服务异常
- 信号处理延迟:>1 秒需要检查 worker 负载
压力测试建议
- DecisionTask 超时应大于 P99 延迟的 3 倍
- 模拟网络分区测试补偿事务可靠性
- 持续运行 72 小时验证内存泄漏
开放性问题探讨
脚本复杂度平衡
建议采用 ” 三段式 ” 结构:
- 主流程只包含成功路径
- 错误处理集中定义在补偿块
- 业务规则通过 Signal 动态注入
跨地域一致性
可考虑:
- 使用
CrossRegionTaskQueue路由到最近数据中心 - 关键操作采用
StronglyConsistent模式 - 最终一致性检查器定期比对全局状态
实践心得
经过半年生产验证,我们总结出两个核心经验:首先,所有工作流必须设计成 ” 可中断可继续 ” 的,这比追求单次执行成功率更重要;其次,补偿逻辑的测试用例应该比主流程多 3 倍。Cadence 的真正价值在于,它让复杂分布式事务变得像写本地代码一样直观。
下次当我们讨论是否应该拆分某个巨型工作流时,或许应该先问:这个流程的中断恢复成本,是否已经超过了拆分带来的维护开销?
正文完
发表至: 未分类
近一天内
