Level-triggered reconciliation
Correctness comes from reading current state and reducing drift, not from trusting an event history.
A Pod disappears between two observations. The controller owns the invariant and knows how to restore it. Nothing in the architecture tells the controller that the world changed.
Who announces that reality moved?
A replica count changes. A machine disappears. A new object is accepted. Every event creates possible drift, but no controller is automatically aware of it.
A controller cannot correct a difference it has not observed.
The obvious solution is request-response. Ask the source of truth for the latest state. Compare. Wait. Ask again.
So let us build the polling machine and allow it to succeed.
An observer can spend work because time passed or because reality changed. Those two cost models look similar at one controller and radically different at five hundred.
Every interval creates a request whether the system changed or remained perfectly quiet.
Stable reality stays quiet. Activity rises only when state actually changes.
Polling generates work because time passed. Watching generates work because reality changed.
Each controller periodically asks the source of truth for the current objects relevant to its invariant. It is simple, correct, and initially cheap.
One controller asks every ten seconds. A Pod fails. The next request discovers it. Reconciliation restores the invariant.
The architecture is correct. The delay is bounded by the interval, and the next request naturally recovers from a failed request.
Bounded model: every listed change is relevant to every controller and is discovered by a distinct next poll. Real relevance and change coalescing can only reduce the useful-answer count.
Ready: Configure the observers, then run sixty seconds of quiet and change.
Slow discovery is uncomfortable, so the natural improvement is to ask more often. Latency falls. Request volume rises even when reality is still.
One controller makes six requests each minute. A quiet answer still costs one complete exchange.
The same controller now makes sixty requests each minute. Ninety-nine quiet controllers multiply the proof-of-nothing work.
Ready: Place a change between two poll boundaries.
With 500 controllers polling every ten seconds, the source answers 3,000 requests each minute before one meaningful change occurs. The architecture spends most of its effort proving stability.
The system is computationally active while operationally idle.
The numbers are illustrative arithmetic, not measurements or a prescribed interval. They expose the order-of-magnitude pressure: observers multiplied by elapsed intervals, regardless of meaningful activity.
Polling remains correct. Each failure reveals why its observation cost stops matching the work the system actually needs.
Every interval repeats the same request against unchanged state.
Time, not change, creates work.Independent responsibility creates more observers, each with its own schedule.
Observation load grows with observer count.A response saying “nothing changed” still consumes transport, authorization, serialization, and processing.
No-op answers are not free.Shorter intervals improve discovery latency by increasing the request rate everywhere.
Polling trades cost directly for freshness.Most observation work establishes that stable reality remained stable.
Successful growth disconnects effort from meaningful activity.Let the source of truth announce meaningful change.
Responsibility moves to the component best positioned to know when accepted state changes. Observers remain idle while reality is stable.
Communication becomes proportional to meaningful activity rather than elapsed time.
The world should speak when it changes. Observers should listen.
A Watch accelerates observation. It does not guarantee that every announcement arrives exactly once forever. Correctness must remain level-triggered.
Ready: Open the stream, change state, then interrupt observation.
A Watch says “something changed; look again.” It does not transfer correctness into the event stream. Connections drop, processes restart, and observers can miss announcements.
Level-triggered reconciliation survives because it trusts current state. A missed hint delays correction; a full re-read can restore knowledge.
The source of truth announces meaningful change. Observers react instead of rediscovering it on a timer.
The source publishes accepted changes because it is best positioned to know they occurred.
An observer keeps an ongoing relationship rather than creating a fresh question each interval.
An announcement schedules useful work; it does not become the source of correctness.
Reconciliation reads the present report, so a missed event delays correctness rather than destroying it.
A scalable architecture should spend resources reacting to meaningful change, not repeatedly proving that nothing changed.
For a handful of observers and resources, polling is simpler to operate, inspect, and recover than a long-lived stream.
When observers multiplied by resources divided by interval begins to rival useful work, change-driven observation earns its complexity.
Prediction: Choose one model before running the comparison.
Should each controller maintain its own connection?
How many times should one Pod change cross the network?
How many identical copies of state should one process hold?
Can observation itself become shared infrastructure?