The Postgres task queue is experimental. Redis remains the default. Behaviour and operational characteristics can still change.
When to use it
Stay on Redis for production unless you are trying the experimental Postgres path on purpose. Use Postgres when you want one datastore for durable jobs, cache, and limiter state, or when Redis memory for the backlog is the pain and Postgres is already sized for the event tables.Enable it
You need a paid license that includes the Postgres queue, and thepostgres-queue feature flag (CONVOY_ENABLE_FEATURE_FLAG or --enable-feature-flag). Then set the provider to postgres in config or the environment. Restart server and agent so both enqueue and consume from the same backend.
queue_provider in convoy.json
CONVOY_QUEUE_PROVIDER
postgres):
Because the cache now shares the database with your event tables, each replica can
answer part of it from memory:
An invalidation applies at once on the replica that made it, and within
local_read_ttl_ms on the others, so keep that window well below the TTLs of the
objects being cached. Set it to a negative value to send every read to the table.
See Configuration for the full queue and cache objects.
What does not change
- Ingest HTTP APIs and brokers stay the same.
- Retry policy, circuit breaking, and rate limits behave the same. Their state lives in Postgres instead of Redis.
- Prometheus queue series names stay the same. When metrics are on, gauges come from a snapshot worker rather than a live scan of every delivery row. See Metrics.
Operations
- Every server and agent replica must use the same
queue_provider. Do not mix Redis and Postgres consumers on one instance. - Switching provider does not migrate in-flight Redis jobs into Postgres. Drain or accept that those Redis tasks are left behind before you flip.
- Size Postgres for the extra write load. The delivery tables and the job queue share the same database.