AI Automation

n8n queue mode với Redis: khi nào cần tách worker

Bạn đã chạy n8n vài tháng, workflow mỗi ngày một nhiều. Tới một ngày, một workflow chạy vòng lặp Python nặng kéo phụt cả instance, các workflow khác phải xếp hàng chờ. Lúc đó bạn mới nghe tới "queue mode" và "worker". Bài này sẽ giải thích main với worker khác nhau thế nào, vì sao queue mode dùng Redis, và quan trọng nhất, khi nào bạn thực sự cần tách worker ra VPS riêng, thay vì chạy tất cả trên một con.

  • n8n queue mode chuyển execution từ main process sang worker qua Redis.
  • Main node chỉ lo API, webhook, scheduling, không chạy workflow.
  • Worker node nhận job từ queue, chạy workflow độc lập, có thể scale ngang.
  • Nên cân nhắc tách worker khi throughput vượt ~30-50 workflow/phút trên 1 worker.

Bài viết áp dụng cho n8n bản 1.x trên VPS Ubuntu 24.04 hoặc Debian 12, chạy bằng Docker Compose. Bạn cần có quyền root, Docker và Docker Compose v2 đã cài.

Yêu cầu trước khi bắt đầu

  • Một VPS chạy Ubuntu 24.04 LTS hoặc Debian 12, tối thiểu 2 GB RAM (khuyến nghị 4 GB cho main + 1 worker). Đây là dòng VPS n8n có sẵn Docker và IPv4 riêng Việt Nam.
  • Docker Engine 24+ và Docker Compose v2 (lệnh docker compose, không docker-compose).
  • Redis server, có thể cài chung VPS hoặc dùng Redis Cloud miễn phí 30 MB.
  • Domain hoặc subdomain trỏ tới IP VPS để truy cập n8n Web UI.
  • Kiến thức cơ bản về Docker Compose và file .env.

Main và Worker, ai làm gì?

Mặc định, n8n chạy ở regular mode (EXECUTIONS_MODE=regular): mọi workflow đều chạy trong cùng tiến trình main. Nếu một execution mất nhiều RAM hoặc CPU, nó ảnh hưởng tới API, webhook, và các execution khác. Với n8n queue mode, bạn tách chức năng:

  • Main node, tiếp nhận request (webhook, trigger, API), tạo job và đẩy xuống Redis queue. Main không chạy workflow, chỉ quản lý luồng.
  • Worker node, kết nối tới Redis, lấy job, thực thi workflow, trả kết quả. Worker là cỗ máy chạy thực tế. Bạn có thể chạy một hay nhiều worker (trên cùng VPS hoặc nhiều VPS khác nhau).

Redis đóng vai trò hàng đợi trung gian: main đẩy job, worker lấy job. Công thức này giúp bạn scale ngang: cần thêm sức mạnh → mở thêm worker, không đụng tới main.

Kiểm tra mode hiện tại bằng lệnh docker ps và xem log container n8n. Với queue mode, log worker sẽ hiện "Waiting for work" liên tục.

Kinh nghiệm thực tế: với VPS 4 GB RAM (dòng VPS Linux của thueVPS kiểu VNx4), chạy 1 main + 2 workers vẫn ổn nếu mỗi worker không chạy workflow nặng quá 1 GB RAM.

Cấu hình n8n queue mode với Docker Compose

Chuyển đổi từ regular sang queue mode rất đơn giản. Bạn chỉ cần sửa file docker-compose.yml và thêm biến môi trường.

Bước 1, Thêm Redis service

Trong docker-compose.yml, thêm service Redis:

redis:
  image: redis:7-alpine
  restart: always
  command: --loglevel warning
  volumes:
    - redis_data:/data

Thêm volume ở cuối file:

volumes:
  n8n_data:
  redis_data:

Bước 2, Sửa main container

Thêm hoặc sửa các biến môi trường trong service n8n:

environment:
  - EXECUTIONS_MODE=queue
  - QUEUE_BULL_REDIS_HOST=redis
  - QUEUE_BULL_REDIS_PORT=6379
  - QUEUE_BULL_REDIS_DB=0
  - EXECUTIONS_TIMEOUT=600

EXECUTIONS_MODE=queue là cốt lõi, nó báo n8n chuyển sang chế độ hàng đợi. EXECUTIONS_TIMEOUT=600 giới hạn thời gian chạy mỗi workflow (giây), tránh worker treo vô thời hạn.

Bước 3, Thêm worker service

Thêm một service mới tên worker:

worker:
  image: n8nio/n8n:latest
  command: worker --concurrency=5
  depends_on:
    - redis
  environment:
    - EXECUTIONS_MODE=queue
    - QUEUE_BULL_REDIS_HOST=redis
    - QUEUE_BULL_REDIS_PORT=6379
    - QUEUE_BULL_REDIS_DB=0
    - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
    - DB_TYPE=sqlite
    - DB_SQLITE_DATABASE=/home/node/.n8n/database.sqlite
    - WEBHOOK_URL=https://your-domain.com/
  volumes:
    - n8n_data:/home/node/.n8n

Lưu ý: --concurrency=5 nghĩa là mỗi worker chạy tối đa 5 workflow song song. Nếu concurrency=1, mỗi worker chỉ xử lý 1 job một lúc, an toàn cho workflow nặng nhưng throughput thấp. Bạn nên đặt concurrency = số vCPU của worker.

Bước 4, Kiểm tra hoạt động

Chạy docker compose up -d. Kiểm tra log worker:

docker compose logs worker --tail 50

Bạn sẽ thấy "Worker started" và "Waiting for work", worker sẵn sàng nhận job. Vào Web UI n8n, chạy thử một workflow. Trên main container log sẽ ghi "Job added to queue", worker log sẽ ghi "Start job" rồi "Job finished".

Khi nào cần tách worker sang VPS riêng?

Không phải ai cũng cần queue mode. Nếu bạn chạy dưới 10 workflow nhẹ (HTTP request, nối file, gửi email) và throughput thấp (< 5 workflow/phút), regular mode vẫn ổn. Queue mode bắt đầu có lợi khi:

  • Một workflow nặng kéo sụt cả instance, worker tách biệt giúp main vẫn trả lời webhook kịp.
  • Cần chạy đồng thời nhiều workflow, mỗi worker chạy riêng, không cạnh tranh RAM/CPU với main.
  • Cần scale ngang, thêm VPS worker, không cần nâng cấp VPS main.

Mốc throughput cụ thể: dựa trên benchmark thực tế từ cộng đồng n8n và kinh nghiệm vận hành, nếu workflow của bạn có thời gian chạy trung bình 2-10 giây và throughput vượt 30-50 workflow/phút trên một worker với concurrency=5, bạn nên thêm worker thứ hai. Với workflow nặng (xử lý file, gọi API nhiều, vòng lặp), mốc này giảm xuống 10-15 workflow/phút. Dưới đây là bảng tham khảo:

Số workflow/phútCấu hình khuyến nghị
< 10Regular mode hoặc 1 worker concurrency=5
10-301 worker concurrency=10
30-1002-3 workers (có thể trên cùng VPS nếu VPS ≥ 8 GB)
> 100Tách worker sang VPS riêng, mỗi VPS 1 worker concurrency=5-10

Đo throughput thực tế bằng cách vào n8n UI > Workflows > Execution log, xem số execution trong 1 phút ở giờ cao điểm. Nếu thấy hàng đợi Redis dài (kiểm tra bằng redis-cli LLEN bull:n8n:waiting), đã đến lúc thêm worker.

Xử lý lỗi thường gặp

1. Worker không nhận job

Kiểm tra Redis có chạy không: docker compose exec redis redis-cli ping → phải trả "PONG". Kiểm tra biến QUEUE_BULL_REDIS_HOST có đúng tên service Redis không.

2. Worker báo "Error: EACCES"

Worker không có quyền ghi volume. Kiểm tra UID/GID trong container, hoặc chạy worker với user: "1000:1000" nếu VPS dùng user 1000, hoặc cấp quyền thư mục .n8n với chown -R 1000:1000.

3. Redis hết bộ nhớ

Nếu bạn có hàng nghìn workflow mỗi phút, Redis có thể đầy. Giới hạn bộ nhớ Redis bằng maxmemory 256mbmaxmemory-policy allkeys-lru trong lệnh khởi chạy Redis.

Câu hỏi thường gặp

Queue mode có bắt buộc phải dùng Redis không?

Có. n8n queue mode dùng thư viện Bull, yêu cầu Redis làm backend queue. Không thể chạy queue mode với SQLite hay PostgreSQL trực tiếp, Redis là bắt buộc.

Tôi có thể chạy worker trên VPS Windows không?

Có thể, nhưng không khuyến khích. n8n worker chạy ổn trên Linux. Nếu bạn dùng Windows, hãy dùng Docker Desktop trên VPS Windows và mount volume đúng cách.

Có cần nhiều VPS cho queue mode không?

Không. Bạn hoàn toàn có thể chạy main + Redis + 1 worker trên cùng một VPS 4 GB RAM. Tách VPS chỉ cần khi throughput cao hoặc muốn cách ly tài nguyên.

Worker chạy độc lập thì có cần database không?

Worker không cần database riêng. Nó ghi kết quả execution vào database chung của main (SQLite hoặc PostgreSQL). Worker chỉ cần kết nối tới Redis và database chính (nếu DB_TYPE chỉ tới main DB).

Concurrency=5 nghĩa là chạy 5 workflow cùng lúc hay lần lượt?

Chạy tối đa 5 workflow song song trong cùng một worker process. Nếu bạn đặt concurrency=5, worker có thể xử lý 5 job đồng thời (mỗi job chiếm 1 thread). Cần theo dõi RAM, 5 workflow song song có thể ngốn 2-3 GB.

Làm sao để monitor hàng đợi Redis?

Dùng redis-cli LLEN bull:n8n:waiting (số job đang chờ). Để monitor real-time, dùng lệnh redis-cli MONITOR hoặc cài RedisInsight giao diện đồ hoạ.

Bài viết liên quan

Lưu ý: Bài viết mang tính tham khảo, tổng hợp kiến thức chung. Mỗi hệ thống, hạ tầng và nhu cầu có đặc thù riêng, nên kiểm thử trong môi trường an toàn và tham vấn kỹ sư trước khi triển khai thực tế.