Skip to main content

Journaling Results

Restate uses an execution log for replay after failures and suspensions. This means that non-deterministic results (e.g. database responses, UUID generation) need to be stored in the execution log. The SDK offers some functionalities to help you with this:

  1. Journaled actions: Run any block of code and store the result in Restate. Restate replays the result instead of re-executing the block on retries.

Journaled actions

You can store the result of a (non-deterministic) operation in the Restate execution log (e.g. database requests, HTTP calls, etc). Restate replays the result instead of re-executing the operation on retries.

Here is an example of a database request for which the string response is stored in Restate:

async def do_db_request():
# ... implement ...
return "my_result"
# withClass highlight-line
result = await ctx.run("database request", do_db_request)

You cannot invoke any methods on the Restate context within a side effect. This includes actions such as getting state, calling another service, and nesting other journaled actions.

You can return any payload that can be serialized with bytes(json.dumps(obj), "utf-8") and deserialized with json.loads(buf). If not, you need to specify a custom serializer.

Immediately await journaled actions

Always immediately await ctx.run, before doing any other context calls. If not, you might bump into non-determinism errors during replay, because the journaled result can get interleaved with the other context calls in the journal in a non-deterministic way.