示例说明
用 Saga 模式协调分布式事务,带补偿函数在失败时回滚。本示例属于弹性容错场景,提供可直接复制使用的typescript代码片段,附带边界条件与使用注意事项。
技术要点
- 每步 execute 和 compensate 成对定义
- 失败时逆序补偿已执行步骤
- 补偿失败记录错误继续补偿其余
代码解读
上述代码实现了带补偿的 Saga 协调器的核心逻辑。用 Saga 模式协调分布式事务,带补偿函数在失败时回滚。代码中包含输入校验、核心算法和结果返回三个部分。关键在于正确处理边界情况,例如空输入、非法参数和并发场景。每步 execute 和 compensate 成对定义,失败时逆序补偿已执行步骤。这些设计确保代码在生产环境中的健壮性。
使用建议
在实际项目中使用本示例时,建议先理解带补偿的 Saga 协调器的适用场景与限制条件。补偿失败记录错误继续补偿其余。根据具体业务需求调整参数配置,并编写单元测试覆盖正常路径与边界情况。本代码片段可直接集成到现有项目中,或作为参考实现自行扩展。
代码示例
interface SagaStep<T>{execute:()=>Promise<T>;compensate:(result:T)=>Promise<void>;}export class SagaOrchestrator{private steps:SagaStep<any>[]=[];private results:any[]=[];add<T>(step:SagaStep<T>):this{this.steps.push(step);return this;}async run():Promise<any[]>{for(let i=0;i<this.steps.length;i++){try{const result=await this.steps[i].execute();this.results.push(result);}catch(e){await this.compensate(i);throw e;}}return this.results;}private async compensate(failedIndex:number):Promise<void>{for(let i=failedIndex-1;i>=0;i--){try{await this.steps[i].compensate(this.results[i]);}catch(e){console.error('compensation failed for step',i,e);}}}}