当前位置: 首页 > 知识库问答 >
问题:

如何在不违反决定论的情况下对优步凯登仕工作流程进行更改或修正?[已关闭]

林鹏鹍
2023-03-14

想改进这个问题吗 更新问题,以便通过编辑此帖子,用事实和引用来回答。

升级正在运行的工作流的建议做法是什么?

如果已经有使用以前的工作流实现创建的正在运行的执行,则进行任何代码更改或更新工作流逻辑都会导致Cadence出现“非确定性错误”,因为它无法使用更新的实现重播现有工作流执行的历史记录。

在不破坏现有工作流程执行的情况下,有哪些策略来处理升级?

共有1个答案

拓拔烨赫
2023-03-14

GetVersion用于安全地对工作流定义执行向后不兼容的更改。当有工作流运行时,不允许更新工作流代码,因为它会破坏确定性。解决方案是同时拥有用于重放现有工作流的旧代码以及第一次执行时使用的新代码。GetVersion在第一次执行时返回maxSupport版本。此版本作为标记事件记录到工作流历史记录中。即使maxSupport版本发生更改,记录的版本也会在重播时返回。DefaultVersion常量包含以前未版本化的代码版本。例如,最初的工作流具有以下代码:

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

它应该更新为

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

执行更新的向后兼容方式是

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

然后bar必须更改为baz:

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

稍后,当没有运行DefaultVersion的工作流时,可以删除相应的分支:

v :=  GetVersion(ctx, "fooChange", 1, 2)
if v == 1 {
    err = cadence.ExecuteActivity(ctx, bar).Get(ctx, nil)
} else {
    err = cadence.ExecuteActivity(ctx, baz).Get(ctx, nil)
}

目前没有支持的方法来完全删除引入后的GetVersion调用。即使只剩下一个分支,也要保留它:

GetVersion(ctx, "fooChange", 2, 2)
err = cadence.ExecuteActivity(ctx, baz).Get(ctx, nil)

这是必要的,因为GetVersion根据工作流历史记录执行版本验证,如果工作流代码与其不兼容,则决策失败。

Java也有类似的Workflow.getVersion API。

 类似资料:
  • 局部活动和副作用有什么主要区别?从表面上看,它们似乎都很相似,其中局部活动是一个超集。用户何时应该更喜欢副作用而不是局部活动。

  • https://martimm.github.io/gnome-gtk3/content-docs/tutorial/Application/sceleton.html,缩写为: 在拉库,重要的是主程序保持小型。这是因为所有代码、程序和模块都被解析并编译成中间代码,由虚拟机执行。大多数情况下,这将是MoarVM,但也有一个JVM,稍后可能还有其他JVM。无论如何,在运行之前,编译的模块会保存到。预

  • 我有一个雇主组合。选择雇主后,表格中会填入特定于雇主的数据: 下面是它绑定到的属性和检查表是否脏的方法。如果表是脏的,则提示用户如果他们改变雇主,改变将丢失: 一切似乎都正常工作: 用户选择更新表的雇主('KMH')。 用户对表进行更改。 用户然后选择不同的雇主('MPC') 提示用户更改将丢失 用户选择“否”并且Can火雇主返回“假” 选择雇主不改变(跳过if{}块) 然而,在GUI中,雇主选项

  • 问题内容: 注意:这个问题也可以读为: 如何在Java中支持无哈希的客户端mvc框架的书签。 我正在将使用的有角度的应用程序转换为。我已经成功设置 并且着陆页(index.html)中的所有链接都可以正常工作。 问题是,如果直接引用部分url,我自然会得到一个404,因为服务器端点定义没有耦合到客户端定义的路由。 因此,如果没有HTML5,我们将获得非SEO友好的hashbang,但是有了HTML

  • 我有一个动作执行,其中一个if/fe是如果用户按“A”键,它会将文本设置为不同的内容。程序不是在按“A”后设置文本,而是跳过设置文本并向下移动到下面的if语句。我的问题是,如何让我的程序在我的if语句之前设置文本?我的代码在下面,谢谢!

  • 问题内容: 我需要在 不更改URL的情况下 进行路由。 在自己实现此功能之前,我尝试过通过React Router寻找一些东西。我看到有这样一个东西 : createMemoryHistory([options]) createMemoryHistory创建一个不与浏览器URL交互的内存历史对象。当您需要自定义用于服务器端呈现,自动测试的历史记录对象或不想操纵浏览器URL(例如,将应用程序嵌入到i