Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 22 additions & 22 deletions apps/docs/content/docs/intro/comparison.mdx
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
---
title: Comparison
description: How DataQueue compares to BullMQ and Trigger.dev
description: How DataQueue compares to pg-boss, BullMQ, and Trigger.dev
---

Choosing a job queue depends on your stack, infrastructure preferences, and the features you need. Here is a side-by-side comparison of **DataQueue**, **BullMQ**, and **Trigger.dev**.
Choosing a job queue depends on your stack, infrastructure preferences, and the features you need. Here is a side-by-side comparison of **DataQueue**, **pg-boss**, **BullMQ**, and **Trigger.dev**.

| Feature | DataQueue | BullMQ | Trigger.dev |
| ----------------------- | ------------------------------------------------------- | ------------------------------------------- | --------------------------------------- |
| **Backend** | PostgreSQL or Redis | Redis only | Cloud or self-hosted (Postgres + Redis) |
| **Type Safety** | Full generic `PayloadMap` | Basic types | Full TypeScript tasks |
| **Scheduling** | `runAt`, Cron | Cron, delayed, recurring | Cron, delayed |
| **Retries** | Exponential backoff, configurable `maxAttempts` | Exponential backoff, custom strategies, DLQ | Auto retries, bulk replay, DLQ |
| **Priority** | Integer priority | Priority levels | Queue-based priority |
| **Concurrency Control** | `batchSize` + `concurrency` + global `groupConcurrency` | Built-in | Per-task + shared limits |
| **Rate Limiting** | - | Yes | Via concurrency limits |
| **Job Flows / DAGs** | - | Parent-child flows | Workflows |
| **Dashboard** | Built-in Next.js package | Third-party (Bull Board, etc.) | Built-in web dashboard |
| **Wait / Pause Jobs** | `waitFor`, `waitUntil`, token system | - | Durable execution |
| **Human-in-the-Loop** | Token system | - | Yes |
| **Progress Tracking** | Yes (0-100%) | Yes | Yes (realtime) |
| **Serverless-First** | Yes | No (needs long-running process) | Yes (cloud) |
| **Self-Hosted** | Yes | Yes (your Redis) | Yes (containers) |
| **Cloud Option** | - | - | Yes |
| **License** | MIT | MIT | Apache-2.0 |
| **Pricing** | Free (OSS) | Free (OSS) | Free tier + paid plans |
| **Infrastructure** | Your own Postgres or Redis | Your own Redis | Their cloud or your infra |
| Feature | DataQueue | pg-boss | BullMQ | Trigger.dev |
| ----------------------- | ------------------------------------------------------- | ------------------------ | ------------------------------------------- | --------------------------------------- |
| **Backend** | PostgreSQL or Redis | PostgreSQL only | Redis only | Cloud or self-hosted (Postgres + Redis) |
| **Type Safety** | Full generic `PayloadMap` | TypeScript support | Basic types | Full TypeScript tasks |
| **Scheduling** | `runAt`, Cron | Cron, delayed jobs | Cron, delayed, recurring | Cron, delayed |
| **Retries** | Exponential backoff, configurable `maxAttempts` | Retries with backoff | Exponential backoff, custom strategies, DLQ | Auto retries, bulk replay, DLQ |
| **Priority** | Integer priority | Priority support | Priority levels | Queue-based priority |
| **Concurrency Control** | `batchSize` + `concurrency` + global `groupConcurrency` | Workers + queue policies | Built-in | Per-task + shared limits |
| **Rate Limiting** | - | - | Yes | Via concurrency limits |
| **Job Flows / DAGs** | - | - | Parent-child flows | Workflows |
| **Dashboard** | Built-in Next.js package | - | Third-party (Bull Board, etc.) | Built-in web dashboard |
| **Wait / Pause Jobs** | `waitFor`, `waitUntil`, token system | Delayed/scheduled jobs | - | Durable execution |
| **Human-in-the-Loop** | Token system | - | - | Yes |
| **Progress Tracking** | Yes (0-100%) | - | Yes | Yes (realtime) |
| **Serverless-First** | Yes | Yes | No (needs long-running process) | Yes (cloud) |
| **Self-Hosted** | Yes | Yes | Yes (your Redis) | Yes (containers) |
| **Cloud Option** | - | - | - | Yes |
| **License** | MIT | MIT | MIT | Apache-2.0 |
| **Pricing** | Free (OSS) | Free (OSS) | Free (OSS) | Free tier + paid plans |
| **Infrastructure** | Your own Postgres or Redis | Your own Postgres | Your own Redis | Their cloud or your infra |

## Where DataQueue shines

Expand Down
53 changes: 49 additions & 4 deletions apps/website/app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ const BenefitCard = ({
type ComparisonRow = {
feature: string;
dataqueue: string | boolean;
pgboss: string | boolean;
bullmq: string | boolean;
trigger: string | boolean;
};
Expand All @@ -88,88 +89,126 @@ const comparisonRows: ComparisonRow[] = [
{
feature: 'Backend',
dataqueue: 'PostgreSQL or Redis',
pgboss: 'PostgreSQL only',
bullmq: 'Redis only',
trigger: 'Cloud or self-hosted',
},
{
feature: 'Type Safety',
dataqueue: 'Generic PayloadMap',
pgboss: 'TypeScript support',
bullmq: 'Basic types',
trigger: 'Full TypeScript',
},
{
feature: 'Scheduling',
dataqueue: 'Cron, runAt, waitFor, waitUntil',
pgboss: 'Cron, delayed jobs',
bullmq: 'Cron, delayed, recurring',
trigger: 'Cron, delayed',
},
{
feature: 'Retries',
dataqueue: 'Exponential backoff',
pgboss: 'Retries with backoff',
bullmq: 'Custom strategies + DLQ',
trigger: 'Auto retries + DLQ',
},
{ feature: 'Priority', dataqueue: true, bullmq: true, trigger: true },
{
feature: 'Priority',
dataqueue: true,
pgboss: true,
bullmq: true,
trigger: true,
},
{
feature: 'Concurrency Control',
dataqueue: true,
pgboss: true,
bullmq: true,
trigger: true,
},
{ feature: 'Rate Limiting', dataqueue: false, bullmq: true, trigger: false },
{
feature: 'Rate Limiting',
dataqueue: false,
pgboss: false,
bullmq: true,
trigger: false,
},
{
feature: 'Job Flows / DAGs',
dataqueue: false,
pgboss: false,
bullmq: 'Parent-child flows',
trigger: 'Workflows',
},
{
feature: 'Dashboard',
dataqueue: 'Built-in (Next.js)',
pgboss: false,
bullmq: 'Third-party',
trigger: 'Built-in',
},
{
feature: 'Wait / Pause Jobs',
dataqueue: 'waitFor, waitUntil, tokens',
pgboss: 'Delayed/scheduled jobs',
bullmq: false,
trigger: 'Durable execution',
},
{
feature: 'Human-in-the-Loop',
dataqueue: 'Token system',
pgboss: false,
bullmq: false,
trigger: true,
},
{
feature: 'Progress Tracking',
dataqueue: true,
pgboss: false,
bullmq: true,
trigger: true,
},
{
feature: 'Serverless-First',
dataqueue: true,
pgboss: true,
bullmq: false,
trigger: true,
},
{
feature: 'Self-Hosted',
dataqueue: true,
pgboss: true,
bullmq: true,
trigger: true,
},
{
feature: 'Cloud Option',
dataqueue: false,
pgboss: false,
bullmq: false,
trigger: true,
},
{ feature: 'Self-Hosted', dataqueue: true, bullmq: true, trigger: true },
{ feature: 'Cloud Option', dataqueue: false, bullmq: false, trigger: true },
{
feature: 'License',
dataqueue: 'MIT',
pgboss: 'MIT',
bullmq: 'MIT',
trigger: 'Apache-2.0',
},
{
feature: 'Pricing',
dataqueue: 'Free (OSS)',
pgboss: 'Free (OSS)',
bullmq: 'Free (OSS)',
trigger: 'Free tier + paid',
},
{
feature: 'Infrastructure',
dataqueue: 'Your Postgres or Redis',
pgboss: 'Your Postgres',
bullmq: 'Your Redis',
trigger: 'Their cloud or yours',
},
Expand Down Expand Up @@ -489,6 +528,9 @@ queue.process<EmailJob>('email', async (job) => {
<TableHead className="bg-gradient-to-b from-purple-500/10 to-orange-500/10 text-center font-bold text-foreground">
DataQueue
</TableHead>
<TableHead className="text-center text-muted-foreground">
pg-boss
</TableHead>
<TableHead className="text-center text-muted-foreground">
BullMQ
</TableHead>
Expand All @@ -509,6 +551,9 @@ queue.process<EmailJob>('email', async (job) => {
<TableCell className="bg-gradient-to-b from-purple-500/5 to-orange-500/5 text-center text-foreground">
<ComparisonCell value={row.dataqueue} />
</TableCell>
<TableCell className="text-center text-muted-foreground">
<ComparisonCell value={row.pgboss} />
</TableCell>
<TableCell className="text-center text-muted-foreground">
<ComparisonCell value={row.bullmq} />
</TableCell>
Expand Down
Loading