README

Go framework for Cadence Build Status Coverage Status GoDoc

Cadence is a distributed, scalable, durable, and highly available orchestration engine we developed at Uber Engineering to execute asynchronous long-running business logic in a scalable and resilient way.

cadence-client is the framework for authoring workflows and activities.

How to use

Make sure you clone this repo into the correct location.

git clone git@github.com:uber-go/cadence-client.git $GOPATH/src/go.uber.org/cadence

or

go get go.uber.org/cadence

See samples to get started.

Documentation is available here. You can also find the API documentation here.

Contributing

We'd love your help in making the Cadence Go client great. Please review our contribution guidelines.

License

MIT License, please see LICENSE for details.

Documentation

Overview

Package cadence and its subdirectories contain the Cadence client side framework.

The Cadence service is a task orchestrator for your application’s tasks. Applications using Cadence can execute a logical flow of tasks, especially long-running business logic, asynchronously or synchronously. They can also scale at runtime on distributed systems.

A quick example illustrates its use case. Consider Uber Eats where Cadence manages the entire business flow from placing an order, accepting it, handling shopping cart processes (adding, updating, and calculating cart items), entering the order in a pipeline (for preparing food and coordinating delivery), to scheduling delivery as well as handling payments.

Cadence consists of a programming framework (or client library) and a managed service (or backend). The framework enables developers to author and coordinate tasks in Go code.

The root cadence package contains common data structures. The subpackages are:

- workflow - functions used to implement workflows
- activity - functions used to implement activities
- client - functions used to create Cadence service client used to start and
  monitor workflow executions.
- worker - functions used to create worker instance used to host workflow and
  activity code.
- testsuite - unit testing framework for activity and workflow testing

How Cadence works

The Cadence hosted service brokers and persists events generated during workflow execution. Worker nodes owned and operated by customers execute the coordination and task logic. To facilitate the implementation of worker nodes Cadence provides a client-side library for the Go language.

In Cadence, you can code the logical flow of events separately as a workflow and code business logic as activities. The workflow identifies the activities and sequences them, while an activity executes the logic.

Key Features

Dynamic workflow execution graphs - Determine the workflow execution graphs at runtime based on the data you are processing. Cadence does not pre-compute the execution graphs at compile time or at workflow start time. Therefore, you have the ability to write workflows that can dynamically adjust to the amount of data they are processing. If you need to trigger 10 instances of an activity to efficiently process all the data in one run, but only 3 for a subsequent run, you can do that.

Child Workflows - Orchestrate the execution of a workflow from within another workflow. Cadence will return the results of the child workflow execution to the parent workflow upon completion of the child workflow. No polling is required in the parent workflow to monitor status of the child workflow, making the process efficient and fault tolerant.

Durable Timers - Implement delayed execution of tasks in your workflows that are robust to worker failures. Cadence provides two easy to use APIs, **workflow.Sleep** and **workflow.Timer**, for implementing time based events in your workflows. Cadence ensures that the timer settings are persisted and the events are generated even if workers executing the workflow crash.

Signals - Modify/influence the execution path of a running workflow by pushing additional data directly to the workflow using a signal. Via the Signal facility, Cadence provides a mechanism to consume external events directly in workflow code.

Task routing - Efficiently process large amounts of data using a Cadence workflow, by caching the data locally on a worker and executing all activities meant to process that data on that same worker. Cadence enables you to choose the worker you want to execute a certain activity by scheduling that activity execution in the worker's specific task-list.

Unique workflow ID enforcement - Use business entity IDs for your workflows and let Cadence ensure that only one workflow is running for a particular entity at a time. Cadence implements an atomic "uniqueness check" and ensures that no race conditions are possible that would result in multiple workflow executions for the same workflow ID. Therefore, you can implement your code to attempt to start a workflow without checking if the ID is already in use, even in the cases where only one active execution per workflow ID is desired.

Perpetual/ContinueAsNew workflows - Run periodic tasks as a single perpetually running workflow. With the "ContinueAsNew" facility, Cadence allows you to leverage the "unique workflow ID enforcement" feature for periodic workflows. Cadence will complete the current execution and start the new execution atomically, ensuring you get to keep your workflow ID. By starting a new execution Cadence also ensures that workflow execution history does not grow indefinitely for perpetual workflows.

At-most once activity execution - Execute non-idempotent activities as part of your workflows. Cadence will not automatically retry activities on failure. For every activity execution Cadence will return a success result, a failure result, or a timeout to the workflow code and let the workflow code determine how each one of those result types should be handled.

Asynch Activity Completion - Incorporate human input or thrid-party service asynchronous callbacks into your workflows. Cadence allows a workflow to pause execution on an activity and wait for an external actor to resume it with a callback. During this pause the activity does not have any actively executing code, such as a polling loop, and is merely an entry in the Cadence datastore. Therefore, the workflow is unaffected by any worker failures happening over the duration of the pause.

Activity Heartbeating - Detect unexpected failures/crashes and track progress in long running activities early. By configuring your activity to report progress periodically to the Cadence server, you can detect a crash that occurs 10 minutes into an hour-long activity execution much sooner, instead of waiting for the 60-minute execution timeout. The recorded progress before the crash gives you sufficient information to determine whether to restart the activity from the beginning or resume it from the point of failure.

Timeouts for activities and workflow executions - Protect against stuck and unresponsive activities and workflows with appropriate timeout values. Cadence requires that timeout values are provided for every activity or workflow invocation. There is no upper bound on the timeout values, so you can set timeouts that span days, weeks, or even months.

Visibility - Get a list of all your active and/or completed workflow. Explore the execution history of a particular workflow execution. Cadence provides a set of visibility APIs that allow you, the workflow owner, to monitor past and current workflow executions.

Debuggability - Replay any workflow execution history locally under a debugger. The Cadence client library provides an API to allow you to capture a stack trace from any failed workflow execution history.

Index

Constants

View Source
const LibraryVersion = internal.LibraryVersion

    LibraryVersion is a semver string that represents the version of this cadence client library it will be embedded as a "version" header in every rpc call made by this client to cadence server. In addition, the version string will be used by the server to enforce compatibility checks Update to this version number is typically done by the cadence team as part of a major feature or behavior change

    Variables

    View Source
    var ErrNoData = internal.ErrNoData

      ErrNoData is returned when trying to extract strong typed data while there is no data available.

      Functions

      func IsCanceledError

      func IsCanceledError(err error) bool

        IsCanceledError return if the err is a CanceledError

        func IsCustomError

        func IsCustomError(err error) bool

          IsCustomError return if the err is a CustomError

          func IsGenericError

          func IsGenericError(err error) bool

            IsGenericError return if the err is a GenericError

            func IsPanicError

            func IsPanicError(err error) bool

              IsPanicError return if the err is a PanicError

              func IsTerminatedError

              func IsTerminatedError(err error) bool

                IsTerminatedError return if the err is a TerminatedError

                func IsTimeoutError

                func IsTimeoutError(err error) bool

                  IsTimeoutError return if the err is a TimeoutError

                  func IsWorkflowExecutionAlreadyStartedError

                  func IsWorkflowExecutionAlreadyStartedError(err error) bool

                    IsWorkflowExecutionAlreadyStartedError return if the err is a WorkflowExecutionAlreadyStartedError

                    Types

                    type CanceledError

                    type CanceledError = internal.CanceledError

                      CanceledError returned when operation was canceled.

                      func NewCanceledError

                      func NewCanceledError(details ...interface{}) *CanceledError

                        NewCanceledError creates CanceledError instance. Return this error from activity or child workflow to indicate that it was successfully cancelled.

                        type CustomError

                        type CustomError = internal.CustomError

                          CustomError returned from workflow and activity implementations with reason and optional details.

                          func NewCustomError

                          func NewCustomError(reason string, details ...interface{}) *CustomError

                            NewCustomError create new instance of *CustomError with reason and optional details. Use CustomError for any use case specific errors that cross activity and child workflow boundaries.

                            type RetryPolicy

                            type RetryPolicy = internal.RetryPolicy

                              RetryPolicy defines the retry policy for activity/workflow.

                              Directories

                              Path Synopsis
                              Package activity contains functions and types used to implement Cadence activities.
                              Package activity contains functions and types used to implement Cadence activities.
                              Package client contains functions to create Cadence clients used to communicate to Cadence service.
                              Package client contains functions to create Cadence clients used to communicate to Cadence service.
                              Package encoded contains wrappers that are used for binary payloads deserialization.
                              Package encoded contains wrappers that are used for binary payloads deserialization.
                              Code generated by mockery v1.0.0.
                              Code generated by mockery v1.0.0.
                              Package testsuite contains unit testing framework for Cadence workflows and activities.
                              Package testsuite contains unit testing framework for Cadence workflows and activities.
                              Package worker contains functions to manage lifecycle of a Cadence client side worker.
                              Package worker contains functions to manage lifecycle of a Cadence client side worker.
                              Package workflow contains functions and types used to implement Cadence workflows.
                              Package workflow contains functions and types used to implement Cadence workflows.
                              cmd/dummy
                              This file exists to force compilation of all code that doesn't have unit tests.
                              This file exists to force compilation of all code that doesn't have unit tests.