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

删除步频工作流和活动超时

公西星海
2023-03-14

我正在写一个使用cadence工作流的项目(cadence客户端3.6.2)。我在2018年观看了maxim fateev的一篇演讲,其中提到cadence的工作流是虚拟对象,最好不要将其视为具有起点和终点的过程,因为它们可以始终处于活动状态。

public interface SubscriptionWorkflow {
    @WorkflowMethod
    void manageSubscription(String customerId);
    @SignalMethod
    void cancelSubscription();
    @SignalMethod    
    void updateBillingPeriodChargeAmount(int billingPeriodChargeAmount);
    @QueryMethod    
    String queryCustomerId();
    @QueryMethod        
    int queryBillingPeriodNumber();
    @QueryMethod        
    int queryBillingPeriodChargeAmount();
}

这部分代码来自 https://cadenceworkflow.io/docs/concepts/workflows/#example

在实现工作流时,它需要通过这样的代码指定执行开始到关闭时间秒

public interface SubscriptionWorkflow {
    @WorkflowMethod(executionStartToCloseTimoutSeconds = ...)
    void manageSubscription(String customerId);
    ...
}

或者动态地喜欢

WorkflowOptions options = new WorkflowOptions.Builder().setWorkflowId(...).setTaskList(...)
                .setExecutionStartToCloseTimeout(...).build();
WorkflowStub workflowStub = workflowClient.newUntypedWorkflowStub("SubscriptionWorkflow::manageSubscription",options);
workflowStub.start(...);

它也可以从cli传递

docker run --network=host --rm ubercadence/cli:master --do test-domain workflow start --tasklist the_default_task_list --workflow_type SubscriptionWorkflow::manageSubscription --execution_timeout 3600 --input \"id\"

似乎可以在不指定此超时的情况下启动工作流,工作流中的所有活动也是如此。

如果我想让工作流在我的情况下真正永远存在,有没有办法不添加超时?其活动也是如此

总的来说,拥有永生的工作流是否被认为是一个糟糕的设计

共有1个答案

韦锦程
2023-03-14

我假设您的工作流永远运行,因为它正在实现某种循环。

在这种情况下,工作流最终将生成一个如此之大的历史记录对象,以至于将不再高性能,因为每个循环迭代都是持久化,然后进行处理。

最终,它将达到历史事件的配置限制并失败。

如果不知道为什么要永远运行工作流,就很难提供解决方案。

您可以使用Workflow.continueAsNew()进行调查,它会创建一个具有相同ID的新工作流,但会重新开始历史记录,然后会避免遇到任何限制。

 类似资料:
  • 我有一个由多台机器组成的网络,我正在使用cadence go客户端。 1号机需要登记活动 机器2需要注册工作流程。 机器3需要启动以启动工作流。 cadence前端服务在另一台机器上。 如何使用 go 客户端执行此操作?此外,收银机是否仅将工作流/活动保存在内存中?我怎样才能把它们推到节奏服务,以便其他机器也能找到它们。

  • 假设我们需要向用户发送电子邮件并等待用户回复,然后继续执行工作流。我们是否应该创建一个异步活动来发送电子邮件,并在回复电子邮件到来时完成活动?或者我们是否应该创建一个正常活动来发送电子邮件,然后工作流等待信号,当回复电子邮件到来时,我们将信号发送到工作流?这两个选项是等效的吗?或者有一些差异可以用来决定哪一个用于不同的活动? 提前致谢

  • 我们希望异步调用一个长时间运行的活动,并且在一段时间后基于外部信号,想要取消该长时间运行的活动。 目前,活动了解取消的唯一方式是通过心跳。确保您的活动心跳,并且不吞下心跳方法抛出的异常。

  • 我正在评估使用Cadence来执行长时间运行的批量操作。我有以下代码: 这对于数量较少的实体很好,但我很快遇到了以下异常: 看起来我很快就耗尽了线程池,Cadence无法安排新任务。 我通过将的定义更改为: 这基本上是以200个块为单位处理项目,并等待每个块完成,然后再移动到下一个块。我担心这将执行得如何(在重试时,块中的单个错误将停止处理以下块中的所有记录)。我还担心Cadence在发生崩溃时能

  • 这可以被认为是在节奏工作流的循环中调用相同活动的后续问题:在活动迭代的情况下,工作流如何恢复?是继续调用第i个活动(跳过已经调用的活动)还是从0重新开始?如果是这样,如何编写工作流以跳过调用的活动(0-'k')?

  • 正如标题所示,我无法使用delete()选项。我在网上发了很多帖子,但都找不到正确的答案。我正在Homestead上使用Laravel5.5(一周前安装,最新版本左右)。 让我给你一些代码,我真的希望有人能帮助我。 这让我头痛,奥氮平快用完了。请告诉我我做错了什么,如果遗漏了什么,请告诉我! 这是我的控制器: 这是我的索引页(索引与后端的管理索引相同: 然后是路线: 然后政策: 最后是中间件: 在