Skip to main content
By default Convoy enqueues delivery work in Redis (Asynq), and Redis also holds cache, rate limits, and circuit breaker state. On a paid license you can set the queue provider to Postgres instead. That switch moves the task queue, cache, rate limits, and circuit breaker into Postgres. Redis is not required in that mode.
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 the postgres-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
Without the license or the flag, the process refuses to start with that provider set. Redis DSN is not required when the provider is Postgres. Optional tuning (ignored unless the provider is 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.
For Redis HA when the queue stays on Redis, see Redis & Redis Sentinel.