Выполнение рабочего процесса завершается неудачно, когда работник перезапускается на том же клиенте службы рабочего процесса - PullRequest
0 голосов
/ 21 июня 2019

Мы находимся в процессе написания клиента .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()
    }
}

Это не проблема блокировки и, вероятно, не будет запущена в производство.

Справочная информация:

Мы ( Джефф Лилл и я) заметили эту проблему во время рабочих процессов модульного тестирования в нашем клиенте .NET Cadence.Когда мы запускаем наши тесты рабочего процесса по отдельности, они все проходят, но когда мы запускаем несколько одновременно (последовательно, а не параллельно), мы видим поведение, описанное выше.Это происходит из-за очистки, выполненной в методе dispose() клиента .NET Cadence, вызываемом после завершения теста (успешно или успешно).Одним из способов утилизации является остановка рабочих, созданных во время теста.При следующем тестировании новые работники создаются с использованием того же клиента службы потока операций, и именно здесь возникает проблема.

...