簡體   English   中英

Uber Cadence 工作流程版本控制

[英]Uber Cadence workflow versioning

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 -- 版本 1: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

如果我錯了,請糾正我!

問題是您正在傳遞不同的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM