设置第二个值时MutableSideEffect()出现混乱

时间:2019-06-19 00:21:34

标签: cadence-workflow

我们正在编写.NET Cadence客户端,对 MutableSideEffect()应该如何工作有点困惑。我们一直在考虑 ID 作为变量名来传递,并且开发人员应该能够在工作流中更新可变值。但是,当我们尝试此操作时,第二次 MutableSideEffect()调用因以下错误而失败:

panic: adding duplicate decision DecisionType: Marker, ID: MutableSideEffect_value-1, state=Created, isDone()=false, history=[Created]

我们轻敲了问候语工作流程示例以进行以下调用:

package main

import (
    "fmt"
    "math/rand"
    "time"

    "go.uber.org/cadence/activity"
    "go.uber.org/cadence/workflow"
    "go.uber.org/zap"
)

/**
 * This greetings sample workflow executes 3 activities in sequential. It gets greeting and name from 2 different activities,
 * and then pass greeting and name as input to a 3rd activity to generate final greetings.
 */

// ApplicationName is the task list for this sample
const ApplicationName = "greetingsGroup"

// This is registration process where you register all your workflows
// and activity function handlers.
func init() {
    workflow.Register(SampleGreetingsWorkflow)
    activity.Register(getGreetingActivity)
    activity.Register(getNameActivity)
    activity.Register(sayGreetingActivity)
}

// SampleGreetingsWorkflow Workflow Decider.
func SampleGreetingsWorkflow(ctx workflow.Context) error {
    // Get Greeting.
    ao := workflow.ActivityOptions{
        ScheduleToStartTimeout: time.Minute,
        StartToCloseTimeout:    time.Minute,
        HeartbeatTimeout:       time.Second * 20,
    }
    ctx = workflow.WithActivityOptions(ctx, ao)

    logger := workflow.GetLogger(ctx)
    var greetResult string
    err := workflow.ExecuteActivity(ctx, getGreetingActivity).Get(ctx, &greetResult)
    if err != nil {
        logger.Error("Get greeting failed.", zap.Error(err))
        return err
    }

    f := func(ctx workflow.Context) interface{} {
        return rand.Intn(100)
    }

    e := func(a, b interface{}) bool {
        if a == b {
            return true
        }

        return false
    }

    var result int
    sideEffectValue := workflow.MutableSideEffect(ctx, "value-1", f, e)
    err = sideEffectValue.Get(&result)
    if err != nil {
        panic(err)
    }

    logger.Debug("MutableSideEffect-1", zap.Int("Value", result))

    //************** THIS CALL FAILS ************** 

    sideEffectValue = workflow.MutableSideEffect(ctx, "value-1", f, e)
    err = sideEffectValue.Get(&result)
    if err != nil {
        panic(err)
    }

    logger.Debug("MutableSideEffect-2", zap.Int("Value", result))

    // Get Name.
    var nameResult string
    err = workflow.ExecuteActivity(ctx, getNameActivity).Get(ctx, &nameResult)
    if err != nil {
        logger.Error("Get name failed.", zap.Error(err))
        return err
    }

    // Say Greeting.
    var sayResult string
    err = workflow.ExecuteActivity(ctx, sayGreetingActivity, greetResult, nameResult).Get(ctx, &sayResult)
    if err != nil {
        logger.Error("Marshalling failed with error.", zap.Error(err))
        return err
    }

    logger.Info("Workflow completed.", zap.String("Result", sayResult))
    return nil
}

// Get Name Activity.
func getNameActivity() (string, error) {
    return "Cadence", nil
}

// Get Greeting Activity.
func getGreetingActivity() (string, error) {
    return "Hello", nil
}

// Say Greeting Activity.
func sayGreetingActivity(greeting string, name string) (string, error) {
    result := fmt.Sprintf("Greeting: %s %s!\n", greeting, name)
    return result, nil
}

我们在正确考虑吗?

1 个答案:

答案 0 :(得分:0)

这是Go客户端库中的错误。在一次决策中多次使用具有相同ID的MutableSideEffect时,就会发生这种情况。

如果您通过在第二个workflow.Sleep(ctx, time.Second)呼叫之前放置MutableSideEffect来强制做出单独的决定,问题就会消失。

我提交了an issue来解决此问题。

非常感谢您的举报!