Temporal workflow vs Cadence workflow

Disclaimer: I'm the original co-founder and tech lead of the Cadence project and currently co-founder/CEO of the Temporal Technologies.

temporal.io is the fork of the Cadence project by the original founders and tech leads of the Cadence project Maxim Fateev and Samar Abbas. The fork is fully open source under the same MIT (with some SDKs under Apache 2.0) license as Cadence. We started Temporal Technologies and received VC funding as we believe that the programming model that we pioneered through AWS Simple Workflow, Durable Task Framework and the Cadence project has potential which goes far beyond a single company. Having a commercial entity to drive the project forward is essential for the longevity of the project.

The temporal.io fork has all the features of Cadence as it constantly merges from it. It also implemented multiple new features.

Here are some of the technical differences between Cadence and Temporal as of initial release of the Temporal fork.

All thrift structures are replaced by protobuf ones

All public APIs of Cadence rely on Thrift. Thrift object are also stored in DB in serialized form.

Temporal converted all these structures to Protocol Buffers. This includes objects stored in the DB.

Communication protocol switched from TChannel to gRPC

Cadence relies on TChannel which was TCP based multiplexing protocol which was developed at Uber. TChannel has a lot of limitations like not supporting any security and having a very limited number of language bindings. It is essentially deprecated even at Uber.

Temporal uses gRPC for all interprocess communication.

TLS Support

Cadence doesn't support any communication security as it is a limitation of TChannel.

Temporal has support for mutual TLS and is going to support more advanced authentication and authorization features in the future.

Simplified configuration

Temporal has reworked the service configuration. Some of the most confusing parts of it are removed. For example, the need to configure membership seeds is eliminated. In temporal each host upon startup registers itself with the database and uses the list from the database as the seed list.

Release pipelines

Cadence doesn't test any publicly released artifacts including docker images as its internal release pipeline is ensuring the quality of the internally built artifacts only. It also doesn't perform any release testing for dependencies that are not used within Uber. For example, MySQL integration is not tested beyond rather incomplete unit tests. The same applies to the CLI and other components.

Temporal is making heavy investment into the release process. All the artifacts including a full supported matrix of dependencies are going to be subjected through a full release pipeline which is going to include multi-day stress runs.

The other important part of the release process is the ability to generate patches for production issues. The ability to ensure quality of such patches and produce all the necessary artifacts in a timely manner is important for anyone running Temporal in production.

Payload Metadata

Cadence stores activity inputs and outputs and other payloads as binary blobs without any associated metadata.

Temporal allows associating metadata with every payload. It enables features like dynamically pluggable serialization mechanisms, seamless compression, and encryption.

Failure Propagation

In Cadence activity and workflow failures are modeled as a single binary payload and a string reason field. Only Java client supports chaining exceptions across workflow and activity boundaries. But this chaining relies on fragile GSON serialization and doesn't work with other languages.

Temporal activity and workflow failures are modeled as protobufs and can be chained across components implemented in different SDKs. For example, a single failure trace can contain a chain that is caused by an exception that originates in activity written in Python, propagated through Go child workflow up to Java workflow, and later to the client.

Go SDK

Temporal implemented the following improvements over Cadence Go client:

  • Protobuf & gRPC
  • No global registration of activity and workflow types
  • Ability to register activity structure instance with the worker. It greatly simplifies passing external dependencies to the activities.
  • Workflow and activity interceptors which allow implementing features like configuring timeouts through external config files.
  • Activity and workflow type names do not include package names. This makes code refactoring without breaking changes much simpler.
  • Most of the timeouts which were required by Cadence are optional now.
  • workflow.Await method

Java SDK

Temporal implemented the following improvements over Cadence Java client:

  • Workflow and activity annotations to allow activity and workflow implementation objects to implement non-workflow and activity interfaces. This is important to play nice with AOP frameworks like Spring.
  • Polymorphic workflow and activity interfaces. This allows having a common interface among multiple activity and workflow types.
  • Dynamic registration of signal and query handlers.
  • Workflow and activity interceptors which allow implementing features like configuring timeouts through external config files.
  • Activity and workflow type name generation improved

SDKs not supported by Cadence

PHP SDK, Typescript SDK,

SDKs under active development

Python SDK, .NET SDK

Temporal Cloud

Temporal Technologies monetizes the project by providing a hosted version of the Temporal service. There are dozens of companies (including SNAP) already using it in production.

Other

We have a lot of other features and client SDKs for other languages planned. You can find us at Temporal Community Forum.


Overview

The fact is both are under active development. You can see they have some different focuses if looking at their road maps. The two projects share the same vision to let everyone rethink about programming models of long-running business.

Cadence is more matured as an open-source project. The development involves lots of contributors from all over the world.

Tasks across domain+clusters

If you have multiple Cadence clusters, this allows starthing childWF across different clusters and domains.

Support Both Thrift&gRPC

gRPC support is completely done on the server side. Internal traffic is all using gRPC and we are working on letting users migrating from Thrift to gRPC.

Authorization

The permission is based on domain but can be extended. Different from Temporal, the permission policy can be stored within Cadence domain data storage so that you don't have to build another service/storage to manage them. Note that the whole proposal is developed by community member.

Workflow Shadower

Workflow Shadower is built on top of Workflow Replayer to address this problem. The basic idea of shadowing is: scan workflows based on the filters you defined, fetch history for each workflow in the scan result from Cadence server and run the replay test. It can be run either as a test to serve local development purpose or as a workflow in your worker to continuously replay production workflows.

Graceful domain failover

This allows XDC(multiple clusters) mode to reduce the pain of rerun some tasks during failover.

NoSQL plugin model

This allows implementing different NoSQL persistence in a minimum way. By the time writing this post, Temporal haven't started working on it.

MongoDB support

On top of the NoSQL interfaces, MongoDB support is WIP.

Using multiple SQL instances as sharded SQL

This allows user to have a Cadence cluster with a much larger scale. (then using XDC to add more DB instances)

Configuration Storage for Dynamic config

This enables us changing the dynamic configuration(like for ratelimiting) without making any deployment. Just a CLI command can control the behavior of the system.

It's in experiment and still WIP for production ready.

Workflow notification

A WIP eco system project to allow getting notification from Cadence. This is the benefits of Cadence using Kafka to deliver visibility messages. Temporal doesn't use Kafka which will be super difficult to support this feature.

Periodical Healthchecker(Canary) and Benchmark tool and benchmark setup docs

More Documentation

  • Seamless Cluster Migration guidance
  • Dashboard/Monitoring ... ...

Other small improvements that Temporal is missing

  • TerminateIfRunning IDReusePolicy
  • All domain API forwarding policy
  • Better & cleaner XDC configuration
  • Tooling to deserialize database blob data ... ...