Messaging error catalogue — redelivery that is not a bug, push endpoints that refuse, dead-lettering, and the trigger that never fires

Cause, check and fix for the messaging failures that are usually a contract misunderstanding: at-least-once redelivery, a push subscription whose endpoint rejects the POST, a message that disappears because no dead-letter topic exists, an ordering key that serialises throughput, and an Eventarc trigger with no matching source.

markdownreferencev1MK0K-HF95stage: operatetrust: officialfamily: messagingservice: pubsubinterface: anyduplicate messagesat-least-onceexactly-once deliverypush subscriptiondead-letter topicmessage retentionordering keyeventarc triggercloud tasks retryrate limits

Created 21 Oct 2026 · Modified 23 Oct 2026 · 1 version

Messaging error catalogue

1. The consumer sees the same message twice

causenot a bug. Standard Pub/Sub subscriptions are at-least-once
checkis exactly-once delivery enabled on this subscription? By default it is not
fixmake the consumer idempotent — the correct answer. Or enable exactly-once delivery, knowing you have changed the delivery semantics

This is the first row in the catalogue because it is the first thing a queue consumer ported from elsewhere gets wrong, and because "fix the duplicates" is the wrong framing.

2. A push subscription stops delivering

causepush is an HTTP POST to your endpoint. If the endpoint does not return success, Pub/Sub retries
checkwhat is the endpoint returning? On Cloud Run look for 429 "The request was aborted because there was no available instance." and 503 "The request failed because the instance could not start successfully."
fixa 429 is capacity: raise maximum instances, or switch to a pull subscription so the consumer sets its own pace. A 503 is configuration — usually a secret the runtime identity cannot read

A push subscription couples your delivery rate to your service's scaling. That is the trade: pull gives the consumer flow control, push gives you no consumer to run.

3. Messages disappeared

causeno dead-letter topic, and the message exceeded the subscription's retention
checkdoes the subscription have a dead-letter topic? What is its retention set to?
fixconfigure a dead-letter topic on every subscription whose consumer can fail. Without one, a permanently-failing message is retried until retention expires and is then gone with no record

Recorded as an absence: the Pub/Sub overview states no default retention value, so none is quoted here. Read it from the subscription before relying on a replay window.

4. Throughput collapsed after enabling ordering

causeordering keys serialise delivery per key
checkhow many distinct keys are in use? If the answer is "one", every message is in one queue
fixchoose a key with high cardinality, or drop ordering where the consumer does not need it. Pub/Sub's native model is per-message parallelism "unlike partition-based systems" — ordering is the thing that gives that up

This is the row a Kafka migration meets: a partition count became an ordering key, and a low-cardinality key is a one-partition topic.

5. Tasks dispatch too slowly, or all at once

causea Cloud Tasks queue carries the rate limits and the retry parameters — all tasks in it share them
checkwhich queue is this task in, and what are that queue's rate limits?
fixseparate queues for separate policies. A queue is a policy, not a container

6. An Eventarc trigger never fires

causeusually the source, not the destination: the event you expect is not published directly and must come through Cloud Audit Logs — which means the relevant audit log type has to be enabled
checkis this source a direct publisher or an audit-log-derived event? Is that audit log type on for the resource?
fixenable the audit log type, or re-target the trigger at a source that publishes directly

And one shape error: a trigger that needs the message transformed is an Eventarc Advanced design (bus plus pipelines), not a Standard trigger with extra configuration.

Next: guides/messaging/deliver-pubsub-to-cloud-run.md, guides/parity/messaging.md.

Read this document as markdown — the same bytes an agent receives.