How does Temporal handle application data?
This guide provides an overview of data handling using a Data Converter on the Temporal Platform.
Data Converters in Temporal are SDK components that handle the serialization and encoding of data entering and exiting a Temporal Cluster. Workflow inputs and outputs need to be serialized and deserialized so they can be sent as JSON to a Temporal Cluster.
Data Converter encodes and decodes data
The Data Converter encodes data from your application to a Payload before it is sent to the Temporal Cluster in the Client call. When the Temporal Server sends the encoded data back to the Worker, the Data Converter decodes it for processing within your application. This ensures that all your sensitive data exists in its original format only on hosts that you control.
Data Converter steps are followed when data is sent to a Temporal Cluster (as input to a Workflow) and when it is returned from a Workflow (as output). Due to how Temporal provides access to Workflow output, this implementation is asymmetric:
- Data encoding is performed automatically using the default converter provided by Temporal or your custom Data Converter when passing input to a Temporal Cluster. For example, plain text input is usually serialized into a JSON object.
- Data decoding may be performed by your application logic during your Workflows or Activities as necessary, but decoded Workflow results are never persisted back to the Temporal Cluster. Instead, they are stored encoded on the Cluster, and you need to provide an additional parameter when using
temporal workflow show
or when browsing the Web UI to view output.
Each piece of data (like a single argument or return value) is encoded as a Payload, which consists of binary data and key-value metadata.
For details, see the API references:
What is a Payload?
A Payload represents binary data such as input and output from Activities and Workflows. Payloads also contain metadata that describe their data type or other parameters for use by custom encoders/converters.
When processed through the SDK, the default Data Converter serializes your data/value to a Payload before sending it to the Temporal Server. The default Data Converter processes supported type values to Payloads. You can create a custom Payload Converter to apply different conversion steps.
You can additionally apply custom codecs, such as for encryption or compression, on your Payloads.
What is a default Data Converter?
Each Temporal SDK includes and uses a default Data Converter. The default Data Converter converts objects to bytes using a series of Payload Converters and supports binary, Protobufs, and JSON formats. It encodes values in the following order:
- Null
- Byte array
- Protobuf JSON
- JSON
For example:
- If a value is an instance of a Protobuf message, it is encoded with proto3 JSON.
- If a value isn't null, binary, or a Protobuf, it is encoded as JSON. Most common input types — including strings, integers, floating point numbers, and booleans — are serializable as JSON. If any part of it is not serializable as JSON, an error is thrown.
The default Data Converter serializes objects based on their root type, rather than nested types. The JSON serializers of some SDKs cannot process lists with Protobuf children objects without implementing a custom Data Converter.
What is a custom Data Converter?
A custom Data Converter extends the default Data Converter with custom logic for Payload conversion or encoding.
You can create a custom Data Converter to alter formats (for example, using MessagePack instead of JSON) or add compression and encryption.
A Payload Codec encodes and decodes Payloads, with bytes-to-bytes conversion.
To use custom encryption or compression logic, create a custom Payload Codec with your encryption/compression logic in the encode
function and your decryption/decompression logic in the decode
function.
To implement a custom Payload Codec, you can override the default Data Converter, or create a customized Data Converter that defines its own Payload Converter.
Custom Data Converters are not applied to all data; for example, Search Attributes are persisted unencoded so they can be indexed for searching.
A customized Data Converter can have the following three components:
For details on how to implement custom encryption and compression in your SDK, see Data Encryption.