首页 > 解决方案 > Uber Cadence 工作流程版本控制

问题描述

Cadence 工作流程版本控制:

工作流 impl 具有以下代码:

        int version1 = Workflow.getVersion("change123", Workflow.DEFAULT_VERSION, 1);
        logger.info("version1: {}", version1);

工作流程 1 的开始:o/p -- version1: 1

工作流 impl 的变化:

        int version1 = Workflow.getVersion("change1234", Workflow.DEFAULT_VERSION, 2);
        logger.info("version1: {}", version1);       

工作流程 2 的开始:o/p -- version1: 2

工作流 impl 的变化:

       int version1 = Workflow.getVersion("change12345", Workflow.DEFAULT_VERSION, 3);
       logger.info("version1: {}", version1);        

工作流程 3 的开始:o/p -- version1: 3

重播工作流程 2 : o/p --version1: -1

重播工作流程 1 : o/p --version1: -1

我期待低于o / p

重播工作流程 2 : o/p -- version1: 2

重播工作流程 1 : o/p -- version1: 1

所以这意味着我们一次只能维护两个版本的工作流代码,

当前版本和所有旧版本 getVersion 将给出 Workflow.DEFAULT_VERSION

如果我错了,请纠正我!

标签: workflowcadence-workflowuber-cadence

解决方案


问题是您正在传递不同的changeID

要为同一部分维护不同的版本,您必须继续使用相同的 changeID,除非该 changeID 稍后被弃用但您想再次进行更改。

ChangID 是工作流中用于区分更改的不同部分的标识符。例如,您的工作流程:

String resA = activities.executeA();

String resB = activities.executeB();

如果要更改executeA=>executeAA,则变为:

int versionA = Workflow.getVersion("changeToA", Workflow.DEFAULT_VERSION, 1);

if(versionA == 1){
  String resA = activities.executeAA();
}else{
  String resA = activities.executeA();
}


String resB = activities.executeB();

然后稍后如果你想改变 executeAA=>executeAAA 那么它变成:

int versionA = Workflow.getVersion("changeToA", Workflow.DEFAULT_VERSION, 2);

if(versionA == 2){
  String resA = activities.executeAAA();
}else if versionA == 1{
  String resA = activities.executeAA();
}else{
  String resA = activities.executeA();
}


String resB = activities.executeB();

这样您就可以维护多个版本。

然后如果你想改变executeB=>executeBB,那么你必须使用另一个changeID:

int versionA = Workflow.getVersion("changeToA", Workflow.DEFAULT_VERSION, 2);

if(versionA == 2){
  String resA = activities.executeAAA();
}else if versionA == 1{
  String resA = activities.executeAA();
}else{
  String resA = activities.executeA();
}

int versionB = Workflow.getVersion("changeToB", Workflow.DEFAULT_VERSION, 1);

if(versionB == 1){
  String resB = activities.executeBB();
}else{
  String resB = activities.executeB();
}

这里的关键是了解 changeID,确实有点棘手,但是一旦掌握了它,它就很强大。

在您的代码中,因为您总是使用不同的changeID,所以已经启动的工作流程(工作流程 1 和工作流程 2)将始终获得 DEFAULT_VERSION(-1)。

在内部,当处于执行模式(非重播)时,getVersion 将在执行代码时将带有 MaxVersion 的 Marker 事件写入历史记录。

在重放模式下,如果 Marker 存在(changeID 必须匹配,否则标记被忽略),则从 Marker 返回版本,如果不存在(因为 workflow1 在其执行模式下没有 getVersion 代码),则使用minVersion(在您的情况下为 DEFAULT_VERSION)。(如果来自标记的版本低于 minVersion,它将返回错误)

查看更多文档:

对于 golang

对于java


推荐阅读