【问题标题】:Uber Cadence workflow versioningUber Cadence 工作流程版本控制
【发布时间】:2020-11-25 14:55:07
【问题描述】:

Cadence 工作流程版本控制:

工作流实现有以下代码:

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

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

工作流实现的变化:

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

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

工作流实现的变化:

       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

如有错误请指正!!

【问题讨论】:

    标签: workflow cadence-workflow uber-cadence


    【解决方案1】:

    问题是您传入了不同的 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)。 (如果marker的版本低于minVersion,则会返回错误)

    查看更多文档:

    for golang

    for java

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-03
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      相关资源
      最近更新 更多