Bật queue mode cho n8n với Redis và worker để chạy workflow song song

Workflow n8n của bạn bắt đầu chạy chậm khi có nhiều luồng automation cùng lúc. Webhook gọi vào bị timeout, cron job chồng lên nhau, và bạn thấy process n8n ngốn hết CPU. Lúc này, bật queue mode là giải pháp: tách phần xử lý workflow ra worker riêng, dùng Redis làm hàng đợi. Bài này hướng dẫn bạn bật queue mode cho n8n với Redis và worker để chạy workflow song song trên VPS dùng Docker Compose.
- N8n main process chỉ làm nhiệm vụ webhook + API, không xử lý workflow trực tiếp.
- Redis giữ danh sách job. Worker lấy job từ Redis và xử lý.
- Có thể chạy 1 hoặc nhiều worker tùy số core VPS.
- Dữ liệu workflow + credential vẫn nằm trong PostgreSQL, không đổi.
Yêu cầu trước khi bắt đầu
Để làm theo bài này, bạn cần:
- Một VPS chạy Ubuntu 24.04 hoặc Debian 12 (bài dùng Ubuntu 24.04). Mình khuyên dùng thuê VPS Linux có ít nhất 4 GB RAM và 2 vCPU để chạy được n8n + Redis cùng lúc. Nếu bạn chạy nhiều worker, VPS 8 GB RAM là lựa chọn hợp lý.
- Docker và Docker Compose đã cài. Nếu chưa, xem bài cài Docker trên VPS Ubuntu từ A-Z.
- Một instance n8n đang chạy với PostgreSQL làm database (nếu chưa, xem bài cài n8n bằng Docker Compose từ A-Z).
- Kiến thức cơ bản về Docker Compose và environment variable.
Vì sao queue mode lại quan trọng với n8n?
Mặc định, n8n chạy ở chế độ direct (gọi là main process mode). Khi một workflow được kích hoạt (qua webhook, cron, hay manual), n8n dùng chính process Node.js đó để thực thi. Nếu bạn có 5 workflow chạy đồng thời, 5 tác vụ sẽ tranh nhau tài nguyên trong 1 process riêng biệt:
- Webhook bị treo vì process đang bận xử lý workflow.
- Cron job chạy trễ, chồng lên nhau.
- CPU worker (của n8n) đạt rất cao nhanh chóng, gây timeout.
Queue mode giải quyết vấn đề này bằng cách tách responsibility:
- Main process (gọi là
webhook) chỉ nhận request, push job vào Redis queue. - Worker process lấy job từ queue, xử lý độc lập.
- Có thể chạy 1 - N worker tùy nhu cầu, minh bạch scale.
Mình từng gặp tình huống webhook call từ Telegram bot bị timeout 30 giây vì process đang xử lý workflow tạo PDF dài. Bật queue mode xong, webhook trả response ngay, worker xử lý sau. Chất lượng cải thiện rõ.
Bước 1 - Cài đặt Redis chung cho n8n
Nếu bạn chưa có Redis instance riêng, cách đơn giản nhất là chạy Redis dưới dạng container trong cùng Docker Compose với n8n. Thêm block sau vào file docker-compose.yml của bạn:
redis:
image: redis:7-alpine
restart: always
container_name: n8n-redis
volumes:
- redis-data:/data
command: redis-server --appendonly yes
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
retries: 3
Thêm volumes ở cuối file:
volumes:
redis-data:
Giải thích: image redis:7-alpine nhẹ (~30 MB), bật AOF persistence (--appendonly yes) để không mất job nếu container restart. Healthcheck đảm bảo Redis sẵn sàng trước khi n8n khởi động.
Verify sau khi chạy docker compose up -d redis:
docker compose ps
docker exec n8n-redis redis-cli ping
# Output mong đợi: PONG
Bước 2 - Cấu hình n8n main process chạy queue mode
Trong cùng file docker-compose.yml, sửa service n8n (main process) để thêm các biến môi trường sau:
n8n:
image: n8nio/n8n:latest
restart: always
container_name: n8n-main
environment:
- N8N_MODE=queue
- EXECUTIONS_DATA_PRUNE=true
- EXECUTIONS_DATA_MAX_AGE=168
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=your_db_password
- N8N_ENCRYPTION_KEY=your_encryption_key
- QUEUE_BULL_REDIS_HOST=redis
- QUEUE_BULL_REDIS_PORT=6379
- QUEUE_BULL_REDIS_PASSWORD= # để trống nếu không set password
- EXECUTIONS_DATA_PRUNE_MAX_COUNT=5000
ports:
- "5678:5678"
depends_on:
redis:
condition: service_healthy
volumes:
- n8n-data:/home/node/.n8n
Points chú ý:
N8N_MODE=queue, flag chính để bật queue mode.QUEUE_BULL_REDIS_HOSTvàQUEUE_BULL_REDIS_PORTtrỏ đến tên serviceredis(nội bộ Docker network).EXECUTIONS_DATA_PRUNE=true+MAX_AGE/MAX_COUNTđể tự động dọn lịch sử chạy, tránh database phình to.
Verify: sau khi restart n8n main, kiểm tra log:
docker compose logs n8n
# Output nên có dòng: "Queue mode is enabled"
Bước 3 - Thêm service worker vào Docker Compose
Worker là service riêng biệt, chạy cùng image n8nio/n8n nhưng với lệnh khởi tạo khác. Thêm block sau vào docker-compose.yml:
worker:
image: n8nio/n8n:latest
restart: always
container_name: n8n-worker-1
command: worker --concurrency=2
environment:
- N8N_MODE=worker
- EXECUTIONS_DATA_PRUNE=true
- EXECUTIONS_DATA_MAX_AGE=168
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=your_db_password
- N8N_ENCRYPTION_KEY=your_encryption_key
- QUEUE_BULL_REDIS_HOST=redis
- QUEUE_BULL_REDIS_PORT=6379
- QUEUE_BULL_REDIS_PASSWORD=
- N8N_PAYLOAD_SIZE_MAX=16
volumes:
- n8n-data:/home/node/.n8n
Giải thích tham số:
N8N_MODE=worker, worker chạy chế độ riêng, không expose port.command: worker --concurrency=2, flag--concurrencyquyết định mỗi worker xử lý tối đa bao nhiêu job song song. Giá trị hợp lý:số core CPU × 1.5 → 2. Với VPS 4 vCPU, set 3 hoặc 4. Với VPS 2 vCPU, set 2 là đủ.N8N_PAYLOAD_SIZE_MAX=16, tăng giới hạn payload lên 16 MB để xử lý file lớn (nếu cần).
Vậy scale worker thế nào? Bạn chỉ cần thêm nhiều block service worker-2, worker-3 v.v. với image và environment giống hệt, đổi tên container. Sau đó Docker Compose quản lý tất cả. Nếu muốn chạy kiểu swarm, mỗi worker là một Docker service riêng.
Verify worker:
docker compose logs worker
# Output mong đợi: "Worker started" hoặc "Bull: connected to Redis"
Kiểm tra số job đang queue bằng Redis:
docker exec n8n-redis redis-cli llen bull:n8n:wait
# Trả về 0 nếu không có job đợi, hoặc số job đang queue
Bước 4 - Verify toàn hệ thống
Sau khi chạy docker compose up -d, kiểm tra trạng thái toàn bộ service:
docker compose ps
# Output mong đợi: 3 containers (n8n, redis, worker) đều "Up"
Vào http://VPS_IP:5678 đăng nhập n8n. Chạy một workflow bất kỳ (ví dụ workflow có Wait node chờ 30 giây). Trong lúc workflow đang chạy, mở workflow khác và chạy cùng lúc:
- Cả 2 workflow phải chạy đồng thời, không bị xếp hàng chờ nhau.
- Mở log của worker:
docker compose logs -f worker→ thấy 2 job được nhận và xử lý song song.
Nếu webhook gọi: bạn tạo workflow webhook, gửi request từ curl:
curl -X POST http://VPS_IP:5678/webhook/workflow_id
# Response phải trả về ngay lập tức, không chờ xử lý
Xử lý lỗi thường gặp
Worker không nhận job
Triệu chứng: worker log thấy "Connected to Redis" nhưng không có job nào chạy.
Nguyên nhân phổ biến: main process vẫn đang chạy ở N8N_MODE=main hoặc không set N8N_MODE=queue đúng. Kiểm tra log main: docker compose logs n8n | grep -i mode. Nếu thấy "Main mode" thay vì "Queue mode" → sửa biến môi trường và restart.
Redis connection refused
Triệu chứng: container worker restart liên tục, log "connect ECONNREFUSED redis:6379".
Nguyên nhân: Docker network không đúng tên service. Kiểm tra trong docker-compose.yml tên service Redis có đúng là redis không. Dùng docker compose exec worker ping redis để kiểm tra network.
Worker chạy chậm dù đã scale
Nguyên nhân: VPS chạy trên ổ HDD hoặc NVMe bị I/O bound do nhiều worker cùng ghi DB. Kiểm tra load trung bình với htop và iotop. Giải pháp: nâng cấp VPS NVMe hoặc giảm concurrency mỗi worker (set --concurrency=1 trên worker rồi thêm nhiều worker service).
Câu hỏi thường gặp
Queue mode có làm mất workflow đang chạy khi restart không?
Không. Redis lưu danh sách job. Nếu n8n main restart, job vẫn tồn tại trong Redis. Worker sẽ lấy lại job khi worker chạy lại. Tuy nhiên, job đang xử lý dở trên worker bị chết sẽ thất bại (cần retry).
Cần bao nhiêu RAM cho Redis khi chạy queue mode?
Redis rất nhẹ. Với ~1000 job queue cùng lúc chỉ tốn khoảng 10-20 MB RAM. Dùng docker stats để kiểm tra. Bạn không cần lo Redis ngốn tài nguyên VPS.
Có thể chạy worker trên VPS riêng không?
Có. Worker chỉ cần kết nối tới Redis server và PostgreSQL server. Bạn chạy worker container trên VPS Linux khác, trỏ QUEUE_BULL_REDIS_HOST và DB_POSTGRESDB_HOST về IP máy chủ database/Redis. Nhưng nên đặt Redis + DB trong cùng private network (Docker overlay hoặc WireGuard) để giảm latency.
Có bao nhiêu worker là tối đa?
Không có giới hạn lý thuyết. Giới hạn thực tế là tài nguyên VPS (RAM, CPU, I/O PostgreSQL). Mình từng chạy 4 worker mỗi worker concurrency=2 trên VPS 8 GB RAM, chạy ổn. Nếu bạn cần scale > 10 worker, xem xét dùng Docker Swarm hoặc Kubernetes.
Queue mode có hỗ trợ tất cả node trong n8n không?
Đa số node đều hỗ trợ. Một số node yêu cầu main process (như Webhook) cần chạy trên main container. Node xử lý lâu (Code, HTTP Request, PDF generation) rất phù hợp với worker vì không block webhook.
Bài viết liên quan
- n8n queue mode với Redis khi nào cần tách worker, phân tích chi tiết trường hợp nào nên bật queue mode.
- cài n8n trên VPS Ubuntu 24.04 bằng Docker Compose từ A-Z, hướng dẫn cài n8n đầy đủ từ đầu.
- chọn RAM cho n8n theo số workflow chạy song song, cách ước tính RAM dựa trên số luồng automation.
- backup n8n đúng cách encryption key database và credential, sao lưu an toàn khi dùng queue mode.
- webhook n8n không nhận request checklist xử lý theo thứ tự, xử lý lỗi webhook thường gặp.


