From 47402c8235ace10f080ce4bdc152b229def127dd Mon Sep 17 00:00:00 2001 From: Nico Prananta <311343+nicnocquee@users.noreply.github.com> Date: Tue, 24 Feb 2026 13:24:37 +0100 Subject: [PATCH] Update comparison documentation and component to include pg-boss - Modified the comparison documentation to add pg-boss alongside BullMQ and Trigger.dev, providing a more comprehensive overview of job queue options. - Updated the ComparisonRow type and related components to include pg-boss features, ensuring accurate representation in the comparison table. - Enhanced the UI to display pg-boss data in the comparison section, improving clarity for users evaluating job queue solutions. These changes enhance the documentation and user interface, making it easier for users to compare DataQueue with additional job queue options. --- apps/docs/content/docs/intro/comparison.mdx | 44 ++++++++--------- apps/website/app/page.tsx | 53 +++++++++++++++++++-- 2 files changed, 71 insertions(+), 26 deletions(-) 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) => { + + +