Мы находимся в процессе написания клиента .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, вызываемом после завершения теста (успешно или успешно).Одним из способов утилизации является остановка рабочих, созданных во время теста.При следующем тестировании новые работники создаются с использованием того же клиента службы потока операций, и именно здесь возникает проблема.