Run background jobs, queues, and cron schedules.
Nothing to operate.
Push a worker and Darwa gives it a queue, a scheduler, retry policy, a dead-letter queue, concurrency limits, and per-job logs. When the backlog grows it adds workers — and tells you when the queue will be clear.
Bring the worker framework you already use.
Your existing BullMQ, Celery, or Sidekiq worker deploys as-is. Darwa supplies the broker, the scheduler, and the runtime around it.
worker: image-processing runtime: node22 start: node worker.js queue: name: images type: priority concurrency: 20 scale: min: 1 max: 40 on: queue_depth retries: attempts: 5 backoff: exponential dead_letter: true rate_limit: stripe: 100/minute
Every queue pattern, without assembling one.
FIFO for ordering, priority for urgency, delayed for later, scheduled for recurring — declared in config rather than built out of primitives.
Strict ordering per queue or per key, so jobs for one customer never overtake each other.
Ten priority levels. A password reset jumps ahead of a nightly export without a second queue.
Run in ten minutes, at 02:00, or on a timestamp you compute — held by the broker, not a sleeping process.
Existing BullMQ or Sidekiq code connects unchanged; the connection string is injected for you.
Enqueue the same job id twice and only one runs — useful for webhook storms.
Push thousands of jobs in one call and track them as a group with a single progress figure.
| Trigger | What starts the job |
|---|---|
| HTTP request | POST a payload to a worker endpoint and get a job id back |
| Queue message | Anything your app pushes to a Redis-compatible queue |
| Schedule | Cron expressions, or plain-language intervals |
| Database event | Row inserted, updated, or deleted in your managed Postgres |
| Storage upload | A file landing in a bucket starts the job that processes it |
| Webhook | Signed third-party callbacks, verified before your code runs |
Scheduling that does not need its own container.
Cron expressions or plain intervals, attached to the worker that runs them. Missed windows are recorded rather than silently skipped.
Failures retry themselves, then land somewhere you can see.
Exponential backoff by default, a dead-letter queue with a real interface, and a diagnosis instead of a stack trace.
Attempts, backoff curve, and ceiling are per queue. A rate-limited third party gets patient retries; a malformed payload fails fast and goes straight to the dead-letter queue.
Different work needs different limits.
Image processing wants twenty workers. A rate-limited API wants five. An expensive model call wants two. Set it per queue and let the platform hold the line.
| Queue | Concurrency | Scale range | Rate limit | Why |
|---|---|---|---|---|
| image-processing | 20 | 1 → 40 | — | CPU bound, safe to widen |
| email-sending | 5 | 1 → 5 | 300/min | Provider throttles above this |
| stripe-billing | 4 | 1 → 4 | 100/min | API key quota |
| ai-summaries | 2 | 1 → 3 | 20/min | Model cost per call |
| nightly-export | 1 | 1 → 1 | — | Must not run twice |
Rate limits are enforced across the whole pool, not per worker — so scaling to forty workers cannot accidentally quadruple the requests you send a third party.
Per-job logs, not one giant stream to grep.
Open a job and see only its lines, its payload, its attempts, and its timings. Metrics answer the question you actually have: is the backlog growing or shrinking?
Cost is attributed per job, so an expensive queue is obvious before the invoice explains it.
Workers idle at 3 a.m. and you still pay for them.
Darwa watches the shape of your backlog over the week and proposes floors and ceilings that match it — with the saving stated before you agree.
What is queued next.
Not shipped yet. Everything above works without it — this is where the product is heading.
Orchestration without orchestration code — each node keeps its own retries, concurrency, and logs.
Basic and Premium worker pricing, in one place.
Choose a Darwa zone to see exact worker plans and usage rates. Queueing, scheduling, retries, and dead-letter handling are included.
Standard
Pro
Pro Plus
Pro Max
Pro Ultra
- Included IOPS
- 3,000
- Extra IOPS
- $0.01 / IOPS-mo
- Included throughput
- 125 MB/s
- Extra throughput
- $0.09 / MB/s-mo
- First 10 TB / month
- $0.15
- Next 40 TB / month
- $0.14
- Next 100 TB / month
- $0.12
- Over 150 TB / month
- $0.08
- Dedicated public IPv4
- $6.08 / month
- Same availability zone
- Free
- Cross-zone transfer
- $0.02 / GB each way
- Included outbound
- 0 GB
Move one queue over and watch the board.
Your worker code does not change. The broker, scheduler, retries, and dead-letter queue stop being your problem.
The practical questions, answered.
What a worker is, how it differs from a cron job, what happens when a job fails, and when a web service is the better fit.
What is a background worker?+
A background worker is a process that runs without receiving public web traffic. It consumes jobs from a queue, reacts to events, or runs on a schedule, which suits work that takes too long for a web request such as sending email, processing uploads, generating reports, or calling a slow third-party API.
How is a background worker different from a cron job?+
A cron job runs on a fixed schedule and exits. A worker stays running and processes jobs as they arrive. Darwa runs both, so a nightly report can use a schedule while an image pipeline consumes a queue continuously.
Do I need to run my own message broker?+
No. Darwa provides managed queues and schedulers, so there is no separate broker to provision, patch, or monitor. Your worker code stays the same; the queue infrastructure is operated for you.
What happens when a job fails?+
Failed jobs are retried automatically. A job that keeps failing after its retries moves to a dead-letter queue, where it is held for inspection instead of being lost or blocking the rest of the queue.
Can workers scale automatically?+
Yes. Queue-depth autoscaling adds worker capacity as a backlog grows and reduces it when the queue drains, so a traffic spike does not require manual intervention. Concurrency controls cap how many jobs run at once when a downstream API has its own rate limit.
Can I see why a specific job failed?+
Yes. Per-job logs and monitoring show each run and its output, so a failure can be traced to the job that caused it rather than to a single combined log stream.
Should I use a background worker or a web service?+
Use a web service for anything that answers an HTTP request, and a background worker for work that should not receive public traffic. Most applications run both: the web service accepts the request and enqueues the job, and the worker performs it.
Where do workers store their state?+
Workers are for processing rather than durable storage, so pair them with a Darwa managed database or cloud storage bucket for state that has to outlive a job.
What does background worker hosting include?+
Background worker hosting runs non-HTTP processes with managed scheduling, queueing, retries, concurrency limits, logs, and queue-depth autoscaling. It is a job queue platform for teams that want to run background jobs in the cloud without operating brokers and worker servers themselves.
Can I use Darwa for Celery worker hosting or BullMQ queue hosting?+
Yes. Celery worker hosting connects Python workers to the managed queue, while BullMQ queue hosting connects Node.js workers through a Redis-compatible endpoint. Existing Sidekiq, RQ, Asynq, Oban, and Laravel Queue workers can use the same model.
Is cron job hosting different from scheduled task hosting?+
They describe the same core need: run a command on a defined schedule. Darwa cron job hosting accepts cron expressions or readable intervals, while scheduled task hosting adds the same logs, retry behavior, alerts, and durable execution history used by other worker jobs.