如何对Cadence工作流程进行版本控制?

艾玛·塞克(Emrah Seker)

Cadence工作流必须是确定性的,这意味着,如果使用相同的输入参数执行工作流,则预期将产生完全相同的结果。

当我以新的Cadence用户的身份学习上述要求时,我想知道当需要确定性突破性的更改时,如何长期维护工作流。

一个示例场景是,您有一个工作流连续执行Activity1和Activity2,然后您需要更改这些活动的顺序,以便工作流在Activtiy1之前执行Activity2。还有许多其他方法可以进行类似确定性的更改,我想了解如何处理这些更改。

在工作流可以长时间运行(例如几天,几周甚至几个月)的情况下,这一点尤其重要!

艾玛·塞克(Emrah Seker)

显然,这可能是新的Cadence开发人员提出的最常见问题之一。Cadence工作流必须是确定性算法如果工作流算法不确定,则Cadence工作人员在尝试重播历史记录时(例如,在工作人员故障恢复期间)将面临遇到不确定性工作流程错误的风险

有两种方法可以解决此问题:

  • 创建全新的工作流程:这是版本控制工作流程中最幼稚的方法。这种方法听起来很简单:只要您需要更改工作流程的算法,就可以复制原始工作流程并按所需方式对其进行编辑,并为其命名一个新名称,例如MyWorkflow_V2,并开始将其用于所有实例向前。如果您的工作流程不是很长寿,那么您现有的工作流程将在某个时候“耗尽”,您将能够完全删除旧版本。另一方面,由于明显的原因,这种方法会很快变成维护的噩梦。
  • 使用GetVersion()API派生工作流逻辑:Cadence客户端具有一个名为GetVersion的函数,该函数可以告诉您当前正在运行的工作流版本。您可以使用此函数返回的信息来确定需要使用哪个版本的工作流程算法。换句话说,您的工作流程具有新旧算法并排运行,并且您可以为您的工作流程实例选择正确的版本,以确保它们确定地运行。

下面是基于GetVersion()的方法的示例。假设您要在工作流程中更改以下行:

err = workflow.ExecuteActivity(ctx, foo).Get(ctx, nil)

err = workflow.ExecuteActivity(ctx, bar).Get(ctx, nil)

这是一个重大更改,因为它运行bar活动而不是foo如果您只是进行更改而不必担心确定性,那么您的工作流将无法重播(如果需要),并且会陷入不确定性工作流错误中。正确进行此更改的正确方法是更新工作流,如下所示:

v :=  GetVersion(ctx, "fooChange", DefaultVersion, 1)
if v  == DefaultVersion {
   err = workflow.ExecuteActivity(ctx, foo).Get(ctx, nil)
} else {
   err = workflow.ExecuteActivity(ctx, bar).Get(ctx, nil)
}

GetVersion函数接受4个参数:

  • ctx是标准上下文对象
  • “ fooChange”是人类可读的ChangeID或您在工作流程算法中进行的语义更改,破坏了确定性
  • DefaultVersion是一个常数,仅表示版本0,即第一个版本。它作为minSupportedVersion参数传递给GetVersion函数
  • 当前工作流程代码可以处理maxSupportedVersion 1在这种情况下,我们的算法可以支持从DefaultVersionVersion 1(包括1)的工作流版本

当此工作流程的新实例首次到达上面的GetVersion()调用时,该函数将返回maxSupportedVersion参数,以便您可以运行最新版本的工作流程算法。同时,它还将在工作流程历史记录中记录该版本号(内部称为Marker Event),以便将来记住该版本号稍后重播此工作流时,即使您传递了不同的maxSupportedVersion参数(例如,如果您的工作流具有更多版本),Cadence客户端也将继续返回相同的版本号

如果在历史记录重播期间遇到GetVersion调用,并且该历史记录没有先前记录的标记事件,则该函数将返回DefaultVersion,并假设在此工作流程实例的上下文中不存在“ fooChange”

如果您需要在工作流的同一步骤中进行更重大的更改,只需更改上面的代码,如下所示:

v :=  GetVersion(ctx, "fooChange", DefaultVersion, 2) // Note the new max version
if v  == DefaultVersion {
   err = workflow.ExecuteActivity(ctx, foo).Get(ctx, nil)
} else if v == 1 {
   err = workflow.ExecuteActivity(ctx, bar).Get(ctx, nil)
} else { // This is the Version 2 logic
   err = workflow.ExecuteActivity(ctx, baz).Get(ctx, nil)
}

如果您愿意放弃对Version 0的支持,则可以像下面这样更改上面的代码:

v :=  GetVersion(ctx, "fooChange", 1, 2) // DefaultVersion is no longer supported
if v == 1 {
   err = workflow.ExecuteActivity(ctx, bar).Get(ctx, nil)
} else { 
   err = workflow.ExecuteActivity(ctx, baz).Get(ctx, nil)
}

进行此更改之后,如果您的工作流代码针对具有DefaultVersion版本的旧工作流实例运行,则Cadence客户端将引发错误并停止执行。

最终,您可能希望摆脱所有以前的版本,而仅支持最新版本。一种选择是简单地完全摆脱GetVersion调用和if语句,而只用一行代码来完成正确的事情。但是,将GetVersion()调用保留在其中实际上是一个更好的主意,这有两个原因:

  1. GetVersion()使您可以更好地了解如果您的工作人员尝试重播旧工作流程实例的历史记录时出了什么问题。您无需了解神秘的不确定性工作流错误的根本原因,而是会知道失败是由此位置的工作流版本控制引起的。
  2. 如果您需要对工作流程算法的同一步骤进行更重大的更改,则可以重复使用相同的更改ID,并继续遵循与上述相同的模式。

考虑到上面提到的两个原因,当您应该放弃对所有旧版本的支持时,您应该像下面那样更新工作流代码:

GetVersion(ctx, "fooChange", 2, 2) // This acts like an assertion to give you a proper error
err = workflow.ExecuteActivity(ctx, baz).Get(ctx, nil) 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

时间工作流程与Cadence工作流程

来自分类Dev

如何控制页面加载工作流程

来自分类Dev

维护Cadence工作流程信号的顺序

来自分类Dev

如何使用gitflow工作流程进行分支工作?

来自分类Dev

并发版本的正确工作流程

来自分类Dev

适当的版本控制工作流程,可用于混合存储库

来自分类Dev

适当的版本控制工作流程,可用于混合存储库

来自分类Dev

在工作流程中进行Alfresco Fileupload

来自分类Dev

如何在工作流程的不同git分支中保留不同版本的WSDL

来自分类Dev

如何在Jenkins工作流程插件中获取SVN版本号?

来自分类Dev

如何检索Alfresco工作流程的内容?

来自分类Dev

如何在 GitHub Actions 工作流程中进行 apt-get install?

来自分类Dev

Scala-基于控制台的开发工作流程

来自分类Dev

标签栏控制器应如何集成到导航控制器工作流程中?

来自分类Dev

流浪的工作流程

来自分类Dev

AsyncTask工作流程

来自分类Dev

并行工作流程

来自分类Dev

WebRTC工作流程

来自分类Dev

如何在工作流程中获取KNIME工作流程名称

来自分类Dev

如何在GitHub工作流程yml文件中具有工作流程特定的环境

来自分类Dev

启动新的工作流程实例时,如何获取我的工作流程RunID?

来自分类Dev

如何从另一个工作流程终止已暂停的工作流程?

来自分类Dev

使用Docker进行Web开发的正确工作流程

来自分类Dev

该工作流程如何导致废弃的工作?

来自分类Dev

Thinktecture声明授权工作流程。它是如何工作的?

来自分类Dev

如何在snakemake工作流程中追溯用于生成结果文件的确切软件版本

来自分类Dev

如何知道我是否具有文件的最新版本[git lfs lock工作流程]

来自分类Dev

如何根据工作项对装配进行版本控制(预构建)

来自分类Dev

如何在Jenkins工作流程中编辑Build Parameters?

Related 相关文章

  1. 1

    时间工作流程与Cadence工作流程

  2. 2

    如何控制页面加载工作流程

  3. 3

    维护Cadence工作流程信号的顺序

  4. 4

    如何使用gitflow工作流程进行分支工作?

  5. 5

    并发版本的正确工作流程

  6. 6

    适当的版本控制工作流程,可用于混合存储库

  7. 7

    适当的版本控制工作流程,可用于混合存储库

  8. 8

    在工作流程中进行Alfresco Fileupload

  9. 9

    如何在工作流程的不同git分支中保留不同版本的WSDL

  10. 10

    如何在Jenkins工作流程插件中获取SVN版本号?

  11. 11

    如何检索Alfresco工作流程的内容?

  12. 12

    如何在 GitHub Actions 工作流程中进行 apt-get install?

  13. 13

    Scala-基于控制台的开发工作流程

  14. 14

    标签栏控制器应如何集成到导航控制器工作流程中?

  15. 15

    流浪的工作流程

  16. 16

    AsyncTask工作流程

  17. 17

    并行工作流程

  18. 18

    WebRTC工作流程

  19. 19

    如何在工作流程中获取KNIME工作流程名称

  20. 20

    如何在GitHub工作流程yml文件中具有工作流程特定的环境

  21. 21

    启动新的工作流程实例时,如何获取我的工作流程RunID?

  22. 22

    如何从另一个工作流程终止已暂停的工作流程?

  23. 23

    使用Docker进行Web开发的正确工作流程

  24. 24

    该工作流程如何导致废弃的工作?

  25. 25

    Thinktecture声明授权工作流程。它是如何工作的?

  26. 26

    如何在snakemake工作流程中追溯用于生成结果文件的确切软件版本

  27. 27

    如何知道我是否具有文件的最新版本[git lfs lock工作流程]

  28. 28

    如何根据工作项对装配进行版本控制(预构建)

  29. 29

    如何在Jenkins工作流程中编辑Build Parameters?

热门标签

归档