Skip to main content
Yukta tells you exactly what it promises and where each promise stops. This page collects the guarantees that shape how you design workflows and plugins.

Guarantees

Exactly-once is not achievable across the side effects of arbitrary plugins, so Yukta does not claim it.

Back-pressure

Each edge is a stream. A slow consumer makes its producers wait, so memory stays bounded without queues between nodes.
  • Every child subscribes before its source starts, so no early message is lost.
  • A fan-out moves at the speed of its slowest child.
  • Nodes that block while they work run on lightweight threads, so they do not hold up the engine.

Letting a node fall behind

By default delivery is lossless. If you would rather drop messages than slow the producers, put a bounded buffer in front of a node:
When the node is slower than its parents and the buffer is full, it drops the oldest messages (DROP_OLDEST, the default) or the newest (DROP_NEWEST). Drops are counted in the yukta.edge.dropped metric.
If a terminal on one branch fails and stops reading, sibling branches stall until the execution ends. A failing terminal ends the whole run and cancels the other branches.

Idempotent plugins

A plugin is idempotent when running it again for the same message has the same effect as running it once. Use the message id (and the attempt label) as the de-duplication key when a node writes to an external system. This matters in three cases: retries, restart or resume replaying a node, and a crash between a side effect and the node’s recorded output.

Large payloads

Every node a payload passes through carries it in memory. There is no reference-passing mechanism for very large data, so keep payloads small and pass references (file paths, object keys) in messages instead.