Skip to content

How it compares โ€‹

Conveyor is a durable task queue. Its closest peers are asynq (Redis-backed) and River (Postgres-backed), both Go libraries. Conveyor is Postgres-first like River, but ships as a clustered server with a language-neutral wire protocol and push-based dispatch, serves Go, TypeScript, and Python SDKs, and also runs embedded inside a Go process.

CapabilityConveyorasynqRiver
Primary storePostgres or in-memoryRedisPostgres
Runs asServer and embedded libraryLibraryLibrary
DispatchPush (streaming)PollPoll plus LISTEN/NOTIFY
HA / failoverBuilt-in clustering; a lost node's work re-activates elsewhere. Kubernetes and static discovery out of the box, or a pluggable provider interfaceVia Redis (Sentinel/Cluster)Postgres advisory-lock leader election
Transactional enqueueโœ—โœ—โœ“ ยน
Atomic multi-task enqueueโœ“ (EnqueueTx)โœ—โœ“ (InsertMany)
SDK languagesGo, TypeScript, PythonGoGo
Weighted queuesโœ“โœ“โœ—
Per-task priorityโœ“ (1 to 9)โœ— (queue weights)โœ“
Delayed / scheduledโœ“โœ“โœ“
Reschedule a task's run timeโœ“โœ—โœ—
Cron / periodicโœ“ (server-persisted, survives failover)โœ“ (in code)โœ“ (in code)
Unique tasksโœ“โœ“โœ“
Retries with backoffโœ“ (exponential/linear/fixed, server-wide or per task)โœ“โœ“
Dead-letter / archiveโœ“โœ“โœ“
Pause / resume queuesโœ“โœ“โœ“
Rate limitingโœ“ (per-queue, live)DIY ยฒโœ—
Per-key concurrencyโœ“โœ—โœ—
Circuit breakerโœ“ (per task type)โœ—โœ—
Task dependencies (workflows)โœ“ (chains, fan-out/in)โœ—Pro ยณ
Group aggregation / batchingโœ“ (per-group, live)โœ“โœ—
End-to-end payload encryptionโœ“โœ—โœ—
Lifecycle events / webhooksโœ“โœ—โœ—
Task progress reportingโœ“โœ—โœ—
Web operations UIEmbedded, read and writeasynqmonriverui

ยน River commits the job inside your database transaction (InsertTx), so the job and your data commit atomically. Conveyor's broker is owned by the server, so an enqueue is durable but not part of your application transaction. If you need that atomicity, use the outbox pattern or stay on River. It is the main reason to pick River; see migrating from River.

ยฒ asynq rate limiting is the RateLimitError pattern (you supply the limiter), not a built-in server-side limiter.

ยณ Workflow DAGs are a commercial River Pro feature, not part of the OSS core.

The table reflects each project's open-source core at the time of writing; all three are actively developed, so check upstream for changes (corrections welcome via a PR). For durable, long-running business workflows (sagas, multi-day orchestrations), a workflow engine such as Temporal or Cadence is a different and complementary category: Conveyor is a task queue, not a workflow engine.

For the API-level mapping when moving an existing codebase, see migrating from asynq and migrating from River.

Released under the Apache-2.0 License.