diff --git a/apps/docs/content/docs/intro/comparison.mdx b/apps/docs/content/docs/intro/comparison.mdx index db6dc79..a0c2570 100644 --- a/apps/docs/content/docs/intro/comparison.mdx +++ b/apps/docs/content/docs/intro/comparison.mdx @@ -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 diff --git a/apps/website/app/page.tsx b/apps/website/app/page.tsx index 833c185..cf0809f 100644 --- a/apps/website/app/page.tsx +++ b/apps/website/app/page.tsx @@ -80,6 +80,7 @@ const BenefitCard = ({ type ComparisonRow = { feature: string; dataqueue: string | boolean; + pgboss: string | boolean; bullmq: string | boolean; trigger: string | boolean; }; @@ -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', }, @@ -489,6 +528,9 @@ queue.process('email', async (job) => { DataQueue + + pg-boss + BullMQ @@ -509,6 +551,9 @@ queue.process('email', async (job) => { + + +