部署 Mastra workers
將 Mastra workers 作為獨立處理程序執行,讓你能夠分別擴展協調、排程與背景任務,而不受 API 影響。本指南將說明如何使用 Docker Compose 或 Kubernetes 完成全分離式部署。
本指南說明如何將 workers 分離至各自的容器中。如果你只需要讓 workers 與 API 在同一處理程序內執行,請參閱 Workers,不需要額外設定。
開始之前「開始之前」的直接連結
你需要準備:
- 一個 Mastra 應用程式
- Docker 與 Docker Compose,或一個可搭配
kubectl使用的 Kubernetes 叢集 - 一個分散式 PubSub 後端:供
RedisStreamsPubSub使用的 Redis,或供GoogleCloudPubSub使用的 Google Cloud 專案 - 一個所有容器都能連線的共用資料庫。完整清單請參閱支援的儲存後端。
預設的記憶體內 PubSub 無法跨處理程序傳遞事件。將 workers 分離至不同容器之前,必須先設定分散式 PubSub 後端。
設定共用基礎架構「設定共用基礎架構」的直接連結
將 Mastra 執行個體連接至分散式 PubSub 後端與共用資料庫。使用環境變數,讓每個容器都能執行相同的映像檔。
- Redis Streams + PostgreSQL
- Google Cloud Pub/Sub + LibSQL
import { Mastra } from '@mastra/core/mastra'
import { RedisStreamsPubSub } from '@mastra/redis-streams'
import { PostgresStore } from '@mastra/pg'
export const mastra = new Mastra({
storage: new PostgresStore({
connectionString: process.env.DATABASE_URL!,
}),
pubsub: new RedisStreamsPubSub({
url: process.env.REDIS_URL!,
}),
})
import { Mastra } from '@mastra/core/mastra'
import { GoogleCloudPubSub } from '@mastra/google-cloud-pubsub'
import { LibSQLStore } from '@mastra/libsql'
export const mastra = new Mastra({
storage: new LibSQLStore({
url: process.env.DATABASE_URL!,
}),
pubsub: new GoogleCloudPubSub({
projectId: process.env.GCP_PROJECT_ID!,
}),
})
任何支援的儲存後端皆可使用。請將儲存配接器替換為你偏好的資料庫。
部署「部署」的直接連結
建置 Mastra 應用程式。產出的內容會在每個容器中執行。
mastra build這會產生獨立完整的
.mastra/output/目錄。如需建置輸出的詳細資訊,請參閱部署 Mastra 伺服器。建立 Dockerfile,複製預先建置的輸出並安裝正式環境相依套件:
app/DockerfileFROM node:22-alpineWORKDIR /appCOPY .mastra/output/package.json .mastra/output/.npmrc* ./RUN npm install --omit=devCOPY .mastra/output/ .EXPOSE 4111CMD ["node", "index.mjs"]定義全分離式拓撲。此設定會執行六項服務:一個資料庫、一個 PubSub 後端、API 伺服器,以及三個 workers。每個 worker 都執行相同的映像檔,並透過不同的
MASTRA_WORKERS值控制要啟動的 worker。API 將
MASTRA_WORKERS: "false"設為停用所有事件處理。協調 worker 會設定MASTRA_STEP_EXECUTION_URL,將步驟執行請求導向 API 的內部 URL。詳細資訊請參閱步驟執行 URL。所有服務共用一個
MASTRA_WORKER_AUTH_TOKEN。Workers 向 API 傳送請求時會帶上此權杖,讓 API 能驗證呼叫者是受信任的內部服務。詳細資訊請參閱 worker 驗證。- Docker Compose
- Kubernetes
docker-compose.ymlservices:postgres:image: postgres:16-alpineenvironment:POSTGRES_USER: mastraPOSTGRES_PASSWORD: ${POSTGRES_PASSWORD}POSTGRES_DB: mastraports:- '5432:5432'volumes:- pgdata:/var/lib/postgresql/datahealthcheck:test: ['CMD-SHELL', 'pg_isready -U mastra']interval: 5stimeout: 3sretries: 5redis:image: redis:7-alpineports:- '6379:6379'healthcheck:test: ['CMD', 'redis-cli', 'ping']interval: 5stimeout: 3sretries: 5api:build: ./appports:- '4111:4111'environment:DATABASE_URL: postgres://mastra:${POSTGRES_PASSWORD}@postgres:5432/mastraREDIS_URL: redis://redis:6379MASTRA_WORKERS: 'false'MASTRA_WORKER_AUTH_TOKEN: ${MASTRA_WORKER_AUTH_TOKEN}depends_on:postgres:condition: service_healthyredis:condition: service_healthyhealthcheck:test: ['CMD', 'wget', '-qO-', 'http://localhost:4111/api/agents']interval: 5stimeout: 3sretries: 5orchestration-worker:build: ./appenvironment:DATABASE_URL: postgres://mastra:${POSTGRES_PASSWORD}@postgres:5432/mastraREDIS_URL: redis://redis:6379MASTRA_WORKERS: orchestrationMASTRA_STEP_EXECUTION_URL: http://api:4111/apiMASTRA_WORKER_AUTH_TOKEN: ${MASTRA_WORKER_AUTH_TOKEN}depends_on:api:condition: service_healthyscheduler-worker:build: ./appenvironment:DATABASE_URL: postgres://mastra:${POSTGRES_PASSWORD}@postgres:5432/mastraREDIS_URL: redis://redis:6379MASTRA_WORKERS: schedulerMASTRA_WORKER_AUTH_TOKEN: ${MASTRA_WORKER_AUTH_TOKEN}depends_on:api:condition: service_healthybackground-task-worker:build: ./appenvironment:DATABASE_URL: postgres://mastra:${POSTGRES_PASSWORD}@postgres:5432/mastraREDIS_URL: redis://redis:6379MASTRA_WORKERS: backgroundTasksMASTRA_WORKER_AUTH_TOKEN: ${MASTRA_WORKER_AUTH_TOKEN}depends_on:api:condition: service_healthyvolumes:pgdata:在
docker-compose.yml旁建立.env檔案:.envPOSTGRES_PASSWORD=your-secure-passwordMASTRA_WORKER_AUTH_TOKEN=your-shared-secret-token備註請記得設定應用程式所需的其他環境變數(例如模型 Provider 的 API 金鑰)。
建立命名空間,以及包含連線字串的 Secret:
k8s/namespace.yamlapiVersion: v1kind: Namespacemetadata:name: mastra-workerskubectl apply -f k8s/namespace.yamlkubectl create secret generic mastra-secrets -n mastra-workers \--from-literal=POSTGRES_PASSWORD='your-password' \--from-literal=DATABASE_URL='postgresql://mastra:your-password@postgres:5432/mastra' \--from-literal=REDIS_URL='redis://redis:6379' \--from-literal=MASTRA_WORKER_AUTH_TOKEN='your-shared-token'備註將應用程式所需的其他環境變數(例如模型 Provider 的 API 金鑰)加入 Secret,或新增為
--from-literal項目。建置 Docker 映像檔,並推送至叢集能夠提取映像檔的登錄檔:
docker build -t your-registry/mastra-workers:latest ./appdocker push your-registry/mastra-workers:latest套用資料庫、PubSub 後端、API 與三個 workers 的 Deployment 和 Service。以下範例使用叢集內的 Postgres 與 Redis。在正式環境中,請使用代管服務(例如 Amazon RDS、Cloud SQL、ElastiCache、Memorystore)。
k8s/postgres.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: postgresnamespace: mastra-workersspec:replicas: 1selector:matchLabels:app: postgrestemplate:metadata:labels:app: postgresspec:containers:- name: postgresimage: postgres:16-alpineports:- containerPort: 5432env:- name: POSTGRES_USERvalue: mastra- name: POSTGRES_PASSWORDvalueFrom:secretKeyRef:name: mastra-secretskey: POSTGRES_PASSWORD- name: POSTGRES_DBvalue: mastravolumeMounts:- name: pgdatamountPath: /var/lib/postgresql/datavolumes:- name: pgdataemptyDir: {}---apiVersion: v1kind: Servicemetadata:name: postgresnamespace: mastra-workersspec:selector:app: postgresports:- port: 5432targetPort: 5432注意上述 Postgres 範例使用
emptyDir儲存資料,這表示 pod 重新啟動時資料會遺失。在正式環境中,請改用PersistentVolumeClaim或代管資料庫服務。k8s/redis.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: redisnamespace: mastra-workersspec:replicas: 1selector:matchLabels:app: redistemplate:metadata:labels:app: redisspec:containers:- name: redisimage: redis:7-alpineargs: ['--appendonly', 'yes']ports:- containerPort: 6379---apiVersion: v1kind: Servicemetadata:name: redisnamespace: mastra-workersspec:selector:app: redisports:- port: 6379targetPort: 6379k8s/api.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: apinamespace: mastra-workersspec:replicas: 1selector:matchLabels:app: apitemplate:metadata:labels:app: apispec:containers:- name: apiimage: your-registry/mastra-workers:latestports:- containerPort: 4111env:- name: MASTRA_WORKERSvalue: 'false'envFrom:- secretRef:name: mastra-secretsreadinessProbe:httpGet:path: /api/agentsport: 4111initialDelaySeconds: 10periodSeconds: 5livenessProbe:httpGet:path: /api/agentsport: 4111initialDelaySeconds: 15periodSeconds: 10resources:requests:cpu: 500mmemory: 512Mi---apiVersion: v1kind: Servicemetadata:name: apinamespace: mastra-workersspec:selector:app: apiports:- port: 4111targetPort: 4111k8s/orchestration-worker.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: orchestration-workernamespace: mastra-workersspec:replicas: 1selector:matchLabels:app: orchestration-workertemplate:metadata:labels:app: orchestration-workerspec:containers:- name: workerimage: your-registry/mastra-workers:latestenv:- name: MASTRA_WORKERSvalue: orchestration- name: MASTRA_STEP_EXECUTION_URLvalue: http://api:4111/apienvFrom:- secretRef:name: mastra-secretsresources:requests:cpu: 250mmemory: 256Mik8s/scheduler-worker.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: scheduler-workernamespace: mastra-workersspec:replicas: 1selector:matchLabels:app: scheduler-workertemplate:metadata:labels:app: scheduler-workerspec:containers:- name: workerimage: your-registry/mastra-workers:latestenv:- name: MASTRA_WORKERSvalue: schedulerenvFrom:- secretRef:name: mastra-secretsresources:requests:cpu: 250mmemory: 256Mik8s/background-task-worker.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: background-task-workernamespace: mastra-workersspec:replicas: 1selector:matchLabels:app: background-task-workertemplate:metadata:labels:app: background-task-workerspec:containers:- name: workerimage: your-registry/mastra-workers:latestenv:- name: MASTRA_WORKERSvalue: backgroundTasksenvFrom:- secretRef:name: mastra-secretsresources:requests:cpu: 250mmemory: 256Mi套用所有資源清單,並等待 API 準備就緒:
kubectl apply -f k8s/kubectl wait -n mastra-workers --for=condition=ready pod -l app=api --timeout=90skubectl wait -n mastra-workers --for=condition=ready pod -l app=orchestration-worker --timeout=60skubectl wait -n mastra-workers --for=condition=ready pod -l app=scheduler-worker --timeout=60skubectl wait -n mastra-workers --for=condition=ready pod -l app=background-task-worker --timeout=60s驗證整組服務正在執行,且 API 能正常回應:
- Docker Compose
- Kubernetes
docker compose up -ddocker compose pscurl http://localhost:4111/api/agentskubectl get pods -n mastra-workerskubectl port-forward -n mastra-workers svc/api 4111:4111在另一個終端機中執行:
curl http://localhost:4111/api/agents若傳回 Agents 的 JSON 清單,即可確認 API 與 workers 正在執行。
步驟執行 URL「步驟執行 URL」的直接連結
在全分離式部署中,協調 worker 與 API 會在不同容器中執行。協調 worker 處理 Workflow 事件時,會透過 HTTP 將步驟執行委派給 API。
將 MASTRA_STEP_EXECUTION_URL 設為 API 的內部 URL,並包含 /api 前綴:
MASTRA_STEP_EXECUTION_URL=http://api:4111/api
協調 worker 會針對每個步驟,向 ${MASTRA_STEP_EXECUTION_URL}/workflows/:workflowId/runs/:runId/steps/execute 傳送 POST 請求。API 會解析 Workflow,並在本機執行該步驟。
若未設定此變數,協調 worker 會嘗試在處理程序內執行步驟。當 worker 與 API 一同執行時可正常運作,但在分離式部署中,worker 無法存取完整的 Mastra 執行階段,因此會執行失敗。
擴展「擴展」的直接連結
協調與背景任務 workers 可安全地進行水平擴展。PubSub 消費者群組會將事件分配給不同執行個體,因此每個事件只會處理一次:
- Docker Compose
- Kubernetes
docker compose up -d --scale orchestration-worker=3
docker compose up -d --scale background-task-worker=2
kubectl scale deployment/orchestration-worker -n mastra-workers --replicas=3
kubectl scale deployment/background-task-worker -n mastra-workers --replicas=2
若要自動擴展,請新增 HorizontalPodAutoscaler:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: orchestration-worker
namespace: mastra-workers
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: orchestration-worker
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
以 CPU 為基礎的自動擴展需要在叢集中執行 metrics-server。GKE、EKS 與 AKS 等代管叢集預設已包含此元件。
API 也能在負載平衡器後方進行水平擴展。
請勿擴展排程 worker。 只執行一個執行個體。若有多個排程器輪詢相同儲存空間,會針對同一排程觸發重複事件。
當機復原「當機復原」的直接連結
分散式 PubSub 後端會保留尚未確認的事件,因此 workers 能從當機狀態復原:
- 協調 worker:待處理事件會保留在 PubSub 後端。Worker 重新啟動後,會從先前中斷處繼續處理。
- 排程 worker:不會永久遺漏任何事件。排程器重新啟動時,會根據當下時間計算下一次觸發時間,而不是從中斷處繼續。
- 步驟執行期間的 API:協調 worker 的 HTTP 請求會失敗。系統會對事件傳送否定確認,並在下次嘗試時重新傳遞。
如果 API 在步驟執行期間當機(例如休眠途中),該步驟的工作會遺失。Workflow 執行可能持續卡在 running 狀態。Mastra 目前尚未針對此情境提供以逾時為基礎的自動復原機制。
相關資源「相關資源」的直接連結
- Workers:workers 的用途與適用時機
- Worker 驗證:保護 worker 與 API 之間的通訊
- Workers 參考文件:所有 worker 類型的設定詳細資訊
- CLI 參考文件:
mastra worker build與mastra worker start - PubSub:事件傳遞後端
- 部署 Mastra 伺服器:建置輸出與伺服器設定
- 將 Mastra 部署至 Kubernetes:具備持久化 Agents 的多 pod 部署