【Temporal】方法错误处理机制

temporal有一套自己的错误机制,对于workflow和activity方法来说,错误返回都会被temporal层层封装,最后在外部拿到的是一个temporal类型的错误码

对于workflow或者activity方法的错误返回,我们收到的一般都是类似这种信息:

Activity error. Namespace default TaskQueue ting-queue-20130815 WorkerID 1@ting-temporal-worker-769645ffc5-r4489@ WorkflowID 1825b61a-d237-40e8-95e3-a8459fde36ee_11 RunID 2d57479c-abf7-41ae-b661-94f557617846 ActivityType RunOnCheckCancelTaskActivity Attempt 1 Error task canceled

这导致有时候我们想通过返回自定义错误,然后在外部进行错误类型判断的时候取不到的问题。

自定义错误与解包

其实框架提供了机制进行错误的解封装,参考如下:

// TaskTimeoutErr 任务超时
type TaskTimeoutErr struct {
   Msg string
}


func (tt *TaskTimeoutErr) Error() string {
   return tt.Msg
}


func NewTaskTimeoutErr(msg string) *TaskTimeoutErr {
   return &TaskTimeoutErr{msg}
}


// TaskCancelErr 任务取消
type TaskCancelErr struct {
   Msg string
}


func (tc *TaskCancelErr) Error() string {
   return tc.Msg
}


func NewTaskCancelErr(msg string) *TaskCancelErr {
   return &TaskCancelErr{msg}
}


// TaskSkipErr 任务跳过
type TaskSkipErr struct {
   Msg string
}


func (ts *TaskSkipErr) Error() string {
   return ts.Msg
}


func NewTaskSkipErr(msg string) *TaskSkipErr {
   return &TaskSkipErr{msg}
}


func Unwrap(err error) error {
   if temporal.IsCanceledError(err) {
      return TaskCancel
   }


   var applicationErr *temporal.ApplicationError
   if errors.As(err, &applicationErr) {
      log.Debugf("application err, type: %s", applicationErr.Type())
      switch applicationErr.Type() {
      case "TaskTimeoutErr":
         return TaskTimeout
      case "TaskCancelErr":
         return TaskCancel
      case "TaskSkipErr":
         return TaskSkip
      }
   }


   var panicErr *temporal.PanicError
   if errors.As(err, &panicErr) {
      log.Errorf("panic err: %+v", panicErr.StackTrace())
   }
   return err
}

错误重试控制

我们还可以通过自定义错误码来控制temporal 的重试,比如有些错误我们是不需要重试的,那么就可以:

var retryPolicy = &temporal.RetryPolicy{
   InitialInterval:    time.Second,
   BackoffCoefficient: 2,
   MaximumInterval:    time.Minute * 1,
   MaximumAttempts:    100,
   NonRetryableErrorTypes: []string{
      "TaskTimeoutErr",
      "TaskCancelErr",
      "TaskSkipErr",
      "TaskFailErr",
      "TaskFinishedCancelErr",
      "PanicError",
      "TerminatedError",
   },
}


var ActivityOpts = workflow.ActivityOptions{
   StartToCloseTimeout: 168 * time.Hour,
   HeartbeatTimeout:    60 * time.Second,
   RetryPolicy:         retryPolicy,
   WaitForCancellation: true,
}

https://legacy-documentation-sdks.temporal.io/go/error-handling

Temporal 是一种分布式工作流编排框架,用于构建可靠的、跨服务的任务协调。它支持任务的持久化存储以及复杂的业务逻辑处理,并内置了对重试机制的支持。 ### Temporal 实现重试 在 Temporal 中,**活动函数(Activity)** 或 **工作流函数(Workflow)** 可能因为网络故障或其他原因失败。为了提高可靠性,Temporal 提供了一个优雅的方式来配置和管理自动重试策略。 #### 配置重试的基本步骤: 1. **设置 Activity 的重试选项** 当创建一个 `ActivityOptions` 对象时,可以指定它的重试政策(Retry Policy)。这包括最大尝试次数 (`MaximumAttempts`)、初始间隔时间 (`InitialInterval`) 和指数退避因子等参数。 示例代码 (Go): ```go activityOptions := client.ActivityOptions{ RetryPolicy: &common.RetryPolicy{ InitialInterval: time.Second, BackoffCoefficient: 2, // 指数退避系数 MaximumAttempts: 5, // 最大重试次数 }, } ctx = workflow.WithActivityOptions(ctx, activityOptions) err := workflow.ExecuteActivity(ctx, MyActivity).Get(ctx, nil) ``` 2. **捕获异常并触发重试** 如果活动中抛出了非瞬态错误,则会依据设定好的规则启动下一次运行直至达到限制条件为止。对于开发者来说只需要关注正常的流程设计即可无需关心底层细节部分比如如何精确控制什么时候该中断某个特定操作之类的问题。 3. **监控与日志记录** 确保所有关键环节都有适当的跟踪信息输出便于后续排查潜在隐患点所在位置以便快速定位解决问题根源所在之处从而避免类似事件再次发生几率变得越来越低直至完全消除这种风险因素影响正常运转效率造成不必要的损失成本增加等情况出现的可能性降至最低限度范围内合理范围之内满足预期目标要求标准水平之上持续改进优化系统整体性能指标达成更高层次上的成就成果体现价值意义非凡重大深远广泛传播开来获得认可赞赏尊重信任喜爱追捧追逐追求探索研究学习借鉴参考效仿模仿复制粘贴运用实践行动起来吧朋友们让我们一起携手共创美好未来明天世界充满希望光明灿烂辉煌无比美妙绝伦令人向往憧憬不已!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值