在相同的工作流服务客户端上重新启动工作线程时,工作流执行失败

时间:2019-06-20 22:33:12

标签: cadence-workflow

我们正在编写.NET Cadence客户端,并且在单元测试工作流程时遇到问题。当我们启动工作程序,执行工作流程,停止工作程序,再次启动工作流程,然后尝试执行另一个工作流程时,第一个工作流程完成,但是第一个工作流程在client.ExecuteWorkflow()调用期间挂起,最终失败START_TO_CLOSE超时。我通过修改问候语cadence-samples工作流程来复制了此行为。请参见func main()中的循环:

package main

import (
    "context"
    "time"

    "go.uber.org/cadence/client"
    "go.uber.org/cadence/worker"
    "go.uber.org/zap"

    "github.com/pborman/uuid"

    "github.com/samarabbas/cadence-samples/cmd/samples/common"
)

// This needs to be done as part of a bootstrap step when the process starts.
// The workers are supposed to be long running.
func startWorkers(h *common.SampleHelper) worker.Worker {
    // Configure worker options.
    workerOptions := worker.Options{
        MetricsScope: h.Scope,
        Logger:       h.Logger,
    }
    return h.StartWorkers(h.Config.DomainName, ApplicationName, workerOptions)
}

func startWorkflow(h *common.SampleHelper) client.WorkflowRun {
    workflowOptions := client.StartWorkflowOptions{
        ID:                              "greetings_" + uuid.New(),
        TaskList:                        ApplicationName,
        ExecutionStartToCloseTimeout:    time.Minute,
        DecisionTaskStartToCloseTimeout: time.Minute,
    }
    return h.StartWorkflow(workflowOptions, SampleGreetingsWorkflow)
}

func main() {

    // setup the SampleHelper
    var h common.SampleHelper
    h.SetupServiceConfig()

    // Loop:
    //  - start a worker
    //  - start a workflow
    //  - block and wait for workflow result
    //  - stop the worker
    for i := 0; i < 3; i++ {

        // start the worker
        // execute the workflow
        workflowWorker := startWorkers(&h)
        workflowRun := startWorkflow(&h)

        // create context
        // get workflow result
        var result string
        ctx, cancel := context.WithCancel(context.Background())
        err := workflowRun.Get(ctx, &result)
        if err != nil {
            panic(err)
        }

        // log the result
        h.Logger.Info("Workflow Completed", zap.String("Result", result))

        // stop the worker
        // cancel the context
        workflowWorker.Stop()
        cancel()
    }
}

这不是一个阻碍性的问题,可能不会在生产中出现。

背景:

我们(和我Jeff Lill)在.NET Cadence客户端的单元测试工作流程中注意到了此问题。当我们单独运行工作流测试时,它们全部通过,但是当我们一次运行多个(依次而不是并行)时,我们会看到上述行为。这是因为在测试完成(通过或失败)之后调用的.NET Cadence客户端dispose()方法中进行的清理。处置行为之一是停止测试期间创建的工作人员。在下一次测试运行时,将使用相同的工作流服务客户端创建新工作线程,这就是问题所在。

0 个答案:

没有答案