Local Reactivity Is The Small Case
A local reactive value changes, and dependent values update. Inside a small program, that can look like a convenience: less boilerplate, fewer explicit callbacks, and a cleaner way to keep derived state current.
The structure changes when the dependent work is not all in one place. If a value update can trigger work in another process, device, thread, service, region, or fabric cell, the program now has a distributed-systems question even if the source code still looks like reactive notation.
What Becomes Distributed
- Ordering: which update happened first, and which dependent result is allowed to observe it.
- Ownership: which process, region, or device is responsible for the value now.
- Fanout: how many dependents receive the update, and what happens when one of them lags.
- Liveness: whether the system can keep moving when a dependent process stalls or disappears.
- Consistency: which values must agree immediately, and which values may converge later.
Why Concurrency Appears
Reactive programming implies concurrency because many updates can become eligible at different locations in the program. A single-core scheduler can serialize some of that work, but the model itself already contains more than one active place.
Once those active places become autonomous processes, hardware regions, browser workers, services, or machines, the source language has to carry more than dependency notation. It has to carry communication, timing, placement, and failure boundaries.
Cartilage Connection
Cartilage explores this problem as a visible fabric: a process-like tile or region can represent a reactive value or operation, and local ports define how configuration and state cross a boundary. The Cartilage Visual Language article decodes the rendered role alphabet used by that line of work.
The Useful Boundary
The important boundary is where a local update becomes coordination: ordering, consistency, fanout, retry behavior, and the user's ability to understand what changed and why.
That is why reactive programming and distributed systems belong in the same conversation. The first gives a compact way to express dependency over time. The second names the operating cost once those dependencies cross real boundaries.