Ensuring deterministic execution usually requires solving two separate problems: shared state mutation and inherent non-deterministic constructs within the system (e.g., time, random, I/O, concurrency, etc). Temporal's unique programming environment requires that workflow code executes deterministically. This means that the language runtimes must perform accurately and consistently. Despite this need for precision, it is still important to allow users to choose the language they prefer.
During this conversation, we explore the various challenges we have encountered while using different language runtimes to execute workflow code deterministically. We will discuss the techniques that have proven effective, as well as those that have not, and provide insight into what the Temporal team has planned for the future. In addition to discussing our current approaches, we also discuss other promising approaches, such as WASM and system-level deterministic execution, as well as their potential drawbacks.
Our discussion encompasses a range of language runtimes, including Go, Node.js, Python, .NET, and Java Virtual Machine.