# Worker Mode for a Medusa Instance In this document, you'll learn about the worker mode in Medusa and its importance in production. ## What is a Worker? Workers are processes running separately from the main application. They're useful for executing long-running or resource-heavy tasks in the background, such as importing products or updating a search index. With a worker, these tasks are offloaded to a separate process. So, they won't affect the performance of the main application. ![Diagram showcasing how the server and worker work together](https://res.cloudinary.com/dza7lstvk/image/upload/v1711459873/Medusa%20Book/medusa-worker_klkbch.jpg) While workers are especially good for intensive tasks, it's recommended to always configuring a worker process in your setup if possible. --- ## Medusa Runtimes Medusa has three runtime modes: - `server`: the API Routes are registered, and no workers are started. - `worker`: the API Routes aren't registered, and workers are started. - `shared`: (default) the API routes are registered, and workers are started. The runtime mode is configured by the [worker_mode configuration](../../references/medusa_config/interfaces/medusa_config.ConfigModule.mdx#worker_mode) in `medusa-config.js`. For example: ```js title="medusa-config.js" const projectConfig = { // ..., database_url: "...", worker_mode: "worker", } ``` --- ## Usage in Production When deploying the Medusa backend in production, it's recommended to deploy two instances: 1. One having the `worker_mode` configuration set to `server`. 2. Another having the `worker_mode` configuration set to `worker`. In this case, it's best to set the `worker_mode` configuration's value to an environment variable, then set that environment variable differently for each deployed instance. For development, you can use `shared` as the environment variable's values. :::tip Check out the [Railway Deployment Guide](../../deployments/server/deploying-on-railway.mdx) as an example. :::