Skip to main content

Consumer control

Pausing, throttling, or draining a consumer from Consumers only does something if your service checks in on that state. Here's how that works on each path.

If you're using the event runtime​

Nothing to do. Consumers built on SQSConsumer (and the rest of the built-in event runtime) check in automatically as they poll for new messages, so dashboard controls just work.

If you're observing an existing consumer​

ConsumerObserver exposes the current control state through observe.control. Check it before pulling your next message:

control = await observe.control.get()

if not control.state.should_pull:
await asyncio.sleep(1)
continue # paused or draining, don't pull anything new

if control.state == "throttled":
await asyncio.sleep(1.0 / (control.throttle_per_sec or 1.0)) # pace yourself

The four states​

StateMeaning
RunningNormal operation, keep pulling.
PausedStop pulling entirely until resumed.
ThrottledKeep pulling, but at a reduced rate (throttle_per_sec).
DrainingLet in-flight work finish, then stop pulling. Used before taking a consumer offline.

If Observatory is briefly unreachable​

Control checks fail open: if a check-in can't reach Observatory, your consumer keeps whatever state it last successfully saw instead of guessing. A short network blip won't accidentally pause your consumer, and a consumer that was already paused won't spring back to life during an outage either.