Event Brokers: Push vs Pull
Push and pull are two different delivery models for events. Each model changes reliability, latency, and how you handle overload.
Simple Explanation
What it is
Push means the broker sends events to your function immediately. Pull means your worker asks the broker for messages when it is ready.
Why we need it
The delivery model determines how your system behaves under load. Pick the wrong one and you either drop data or overwhelm your services.
Benefits
- Clearer capacity planning when you choose the right model.
- Fewer failures because overload is handled correctly.
Tradeoffs
- Push can overwhelm consumers if you cannot scale fast enough.
- Pull can add latency if polling is slow or batch sizes are too large.
Real-world examples (architecture only)
- Push: Pub/Sub -> Function for real-time processing.
- Pull: Queue -> Worker for batch processing.
Core Concepts
- Push delivery: Broker calls your endpoint or triggers your function.
- Pull delivery: Worker polls the broker and acknowledges work.
- Backpressure: How you slow down producers when consumers are overloaded.
- Ack semantics: What happens when a message is not acknowledged.
- Batching: Pull allows controlled batch sizes to improve throughput.
Push Model (When the Broker Sends Events)
Typical services: SNS -> Lambda, Pub/Sub push -> Cloud Run/Functions.
Good for:
- Real-time alerts and notifications
- Low-latency processing
- Fan-out (one event -> many consumers)
Risks:
- Sudden bursts can overwhelm consumers
- Retries can amplify load if errors happen
Python example (GCP Pub/Sub push)
import base64
import json
def pubsub_push(request):
envelope = request.get_json(silent=True) or {}
message = envelope.get("message", {})
data = base64.b64decode(message.get("data", "")).decode("utf-8")
event = json.loads(data or "{}")
process_event(event)
return ("OK", 200)
Pull Model (When Workers Fetch Events)
Typical services: SQS, Pub/Sub pull, Cloud Tasks pull.
Good for:
- Controlled throughput
- Batch processing
- Heavy workloads that need steady pacing
Risks:
- Increased latency (polling interval)
- More worker management
Python example (SQS worker)
import json
import boto3
sqs = boto3.client("sqs")
QUEUE_URL = "https://sqs.REGION.amazonaws.com/ACCOUNT/queue"
def poll_and_process():
response = sqs.receive_message(
QueueUrl=QUEUE_URL,
MaxNumberOfMessages=10,
WaitTimeSeconds=10,
)
for record in response.get("Messages", []):
body = json.loads(record["Body"])
process_event(body)
sqs.delete_message(QueueUrl=QUEUE_URL, ReceiptHandle=record["ReceiptHandle"])
Decision Matrix
| Requirement | Prefer Push | Prefer Pull |
|---|---|---|
| Low latency | ✅ | ❌ |
| Controlled throughput | ❌ | ✅ |
| Simple consumer | ✅ | ❌ |
| Heavy batch work | ❌ | ✅ |
| Fan-out to many services | ✅ | ❌ |
Backpressure Strategies
- Push: throttle at the broker, add queues between services, use DLQs.
- Pull: adjust batch size and visibility timeout, scale workers gradually.
Project
Design two versions of the same workflow:
- Push model for low-latency events.
- Pull model for heavy batch processing.
Deliverables:
- Describe the architecture for both models.
- Explain which model you would choose and why.
- List failure scenarios and how each model handles them.
Email your work to [email protected].
References
- AWS SQS: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html
- AWS SNS: https://docs.aws.amazon.com/sns/
- Google Cloud Pub/Sub: https://cloud.google.com/pubsub/docs/overview
- Cloud Tasks: https://cloud.google.com/tasks/docs