Skip to main content
Springwinter workers run long-lived container processes without a public URL. They fit Node.js queue consumers, event processors, schedulers, and asynchronous jobs that continuously pull work. Updated October 9, 2026. A reliable worker acknowledges a job only after success and stops fetching new work during shutdown.

Design the processing loop

The queue is the source of truth. Keep concurrency bounded, make handlers idempotent, and distinguish retryable failures from permanent failures.
Real code should set a maximum drain period. If processing can exceed that period, extend queue visibility while the job runs and allow retries after interruption.

Package the worker

Use a multi-stage Dockerfile and run Node directly. The worker does not need EXPOSE or an HTTP server.

Deploy on Springwinter

1

Create a Worker resource

In your project, click Add resource and select Worker.
2

Select the code

Choose the GitHub repository and production branch. Set the start command only when the image does not already define one.
3

Set compute and configuration

Choose CPU and memory, then add queue URLs, concurrency, timeouts, and service credentials as environment variables.
4

Verify processing

Deploy a test message. Confirm one successful side effect, one acknowledgement, and useful structured logs.

Reliability rules

  • Use a durable queue rather than in-memory job state.
  • Include an idempotency key in each message.
  • Acknowledge only after the durable side effect succeeds.
  • Configure dead-letter handling for repeatedly failing jobs.
  • Keep concurrency below downstream database and API limits.
  • Emit job duration, success, retry, and failure counters.
  • Test container replacement while jobs are running.

Scaling and cost

Increase task size when each job needs more CPU or memory. Increase worker replicas when jobs are independent and queue depth rises. Current Springwinter workers are continuously running services, so they are not a scale-to-zero substitute for one-off ECS tasks or AWS Batch.

Frequently asked questions

A Springwinter Worker does not expose a public HTTP port. Use process liveness, queue metrics, job completion metrics, and logs to determine whether it is making progress.
Yes, but bound concurrency explicitly. Unlimited promises can exhaust memory, database connections, queue visibility windows, or third-party rate limits.
Stop polling after SIGTERM, finish work within the drain window, then exit. Jobs that cannot finish safely must become visible again and be idempotent when retried.

Sources and further reading

Last modified on October 8, 2026