III. Cấu hình n8n queue mode với docker compose
I. Tại sao lại cần queue mode?
Khi quy trình tự động hóa n8n của bạn ngày càng phức tạp, việc vận hành chúng một cách hiệu quả có thể trở thành một thách thức. Việc chạy tất cả trên một quy trình duy nhất có thể dẫn đến thời gian thực thi chậm, gây quá tải hệ thống không cần thiết, hoặc thậm chí khiến quy trình tự động hóa của bạn bị lỗi.
Giải pháp cho vấn đề này là queue mode. Chế độ này được giới thiệu là một hàng đợi công việc phân bổ các tác vụ của bạn trên nhiều quy trình công việc thay vì chạy tất cả ở một nơi. Điều này cho phép các quy trình công việc của bạn chạy độc lập, cải thiện hiệu suất và khả năng mở rộng của hệ thống tự động hóa.
II. Queue mode hoạt động như thế nào?
Theo mặc định, n8n hoạt động trong một tiến trình chính đơn luồng, trong đó tất cả các tác vụ được xử lý tuần tự. Điều này phù hợp với các hệ thống tự động hóa khối lượng công việc thấp, nhưng có thể dẫn đến tắc nghẽn khi khối lượng công việc tăng lên.
Chế độ hàng đợi chia toàn bộ phần cuối n8n của bạn thành ba khu vực riêng biệt:
- 1. Main n8n (Main n8n instance): Chịu trách nhiệm về giao diện trực quan, cấu hình, quy tắc làm việc và quản lý mọi hoạt động của N8N.
- 2. Lưu trữ (database): Đây là nơi lưu trữ tất cả dữ liệu của bạn, chẳng hạn như tác vụ, quy trình làm việc… Điểm khác biệt của N8N thông thường với Queue mode là nó tích hợp Redis, để hoạt động như một trung gian, điều tiết hoạt động của các Worker.
- 3. Công nhân (n8n worker íntance): Đây là nơi diễn ra mọi hoạt động tự động hóa và các bước tự động hóa của bạn được thực hiện song song cùng lúc với nhau thay vì chỉ lần lượt từng tiến trình như n8n thông thường.

III. Cấu hình chế độ hàng đợi trong n8n.
Điều kiện: Để lưu trữ n8n ở chế độ queue mode với Redis trước tiên bạn cần có một máy chủ đang chạy n8n với chế động thông thường (các bạn có thể xem lại hướng dẫn tại đây và tại đây. Tại đây mình sẽ chia sẽ cách cài đặt và cấu hình n8n queue mode với docker và docker compose.
a. Cấu hình Container Redis.
n8n Queue mode phụ thuộc vào Redis như một trung gian để quản lý hàng đợi công việc, khiến nó trở thành một phần quan trọng trong thiết lập này. Để chuẩn bị một Container Redis trên phiên bản n8n ta có thể làm theo các thiết lập sau.
Từ file compose.yaml của n8n ta có thể thêm container Redis như sau.
sudo nano compose.yml
Sau đó dán cấu hình redis vào compose.yml
redis:
image: redis:7
restart: always
command: redis-server --appendonly yes
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 5s
retries: 10
volumes:
- ./redis-data:/data
networks:
- n8n-network
b. Cấu hình các biến môi trường n8n
Sau khi chuẩn bị xong Redis, bạn cần cấu hình các biến cần thiết để bật chế độ hàng đợi trong container n8n.
sudo nano compose.yml
Thêm các biến sau vào container n8n
EXECUTIONS_MODE=queue # Bật chế độ hàng đợi
QUEUE_BULL_REDIS_HOST=redis # Tên máy chủ của Redis.
QUEUE_BULL_REDIS_PORT=6379 # Port của redis, mặc định là 6379
N8N_RUNNERS_ENABLED=true # Chuyển đổi trình chạy tác vụ
N8N_ENCRYPTION_KEY=your-encryption-key-here #khóa mật mã
OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true #Đảm bảo rằng các quy trình thực hiện thủ công cũng được gửi đến worker
Các biến trên là cần thiết để có thể chạy n8n ở chế độ queue mode, bạn có thể cấu hình thêm các biến mở rộng tại đây.
c. Thiết lập n8n Worker
Sau khi chuẩn bị xong n8n ta tiến hành thiết lập container worker trong compose.yaml
Phần này định nghĩa các biến môi trường để cấu hình worker. Đa số chúng giống với dịch vụ n8n chính để đảm bảo worker có thể kết nối với các tài nguyên chung.
sudo nano compose.yml
n8n-worker:
image: docker.n8n.io/n8nio/n8n:latest
restart: always
environment:
- EXECUTIONS_MODE=queue # Bật chế độ hàng đợi
- QUEUE_HEALTH_CHECK_ACTIVE=true #Cho Phép kiểm tra tình trạng hàng đợi
- QUEUE_BULL_REDIS_HOST=redis # Tên máy chủ của Redis.
- N8N_ENCRYPTION_KEY=your-encryption-key-here # khóa mật mã
- N8N_HOST=n8n.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_TRUST_PROXY=true
- N8N_BASIC_AUTH_PASSWORD=************
- N8N_TRUSTED_PROXIES=*
- N8N_SECURE_COOKIE=true
- N8N_RUNNERS_ENABLED=true
- TZ=Asia/Ho_Chi_Minh
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD==************
- WEBHOOK_URL=https://n8n.com/
volumes:
- ./n8n-data:/home/node/.n8n
command: worker --concurrency=5 #Đây là lệnh biến container này thành một worker.
deploy:
replicas: 4 #Đây là số worker sẽ được tạo ra, ở đây là 4.
depends_on: #Tùy chọn này, Đảm bảo rằng worker chỉ khởi động khi các dịch vụ nó phụ thuộc đã sẵn sàng.
n8n:
condition: service_started
postgres:
condition: service_healthy
redis:
condition: service_healthy
networks:
- n8n-network
Lưu ý với biến –concurrency=5 thiết lập này kiểm soát số lượng tác vụ song song mà worker có thể xử lý. Với giá trị là 5, worker này sẽ có thể nhận và xử lý tối đa 5 tác vụ từ hàng đợi cùng một lúc. Khi một tác vụ hoàn thành, worker sẽ ngay lập tức nhận một tác vụ mới (nếu có trong hàng đợi) để đảm bảo không có thời gian nhàn rỗi.
Tại sao lại quan trọng?
Thiết lập concurrency giúp bạn cân bằng giữa hiệu suất và việc sử dụng tài nguyên.
- – Tăng hiệu suất: Nếu bạn có nhiều tác vụ cần xử lý và máy chủ có đủ tài nguyên (CPU, RAM), việc tăng concurrency có thể giúp hoàn thành các tác vụ nhanh hơn.
- – Kiểm soát tài nguyên: Nếu bạn đặt giá trị quá cao, worker có thể sử dụng hết tài nguyên của máy chủ, dẫn đến hệ thống bị chậm hoặc treo. Ngược lại, nếu giá trị quá thấp, worker có thể bị nhàn rỗi ngay cả khi hàng đợi còn nhiều việc.
- – Trong cấu hình Docker Compose trên, bạn có thể kết hợp concurrency với replicas để tạo ra một hệ thống xử lý song song mạnh mẽ. Ví dụ, replicas: 4 và concurrency=5 có nghĩa là bạn có bốn worker, mỗi worker có thể xử lý 5 tác vụ, tổng cộng hệ thống có thể xử lý tối đa 20 tác vụ cùng một lúc.
d. Khởi chạy n8n với queue mode.
Sau khi đã thiết lập xong các bước như trên, ta tiến hành chạy n8n với Queue mode.
docker compose up -d
Nếu bạn thiết lập đúng thì trạng thái docker processes của bạn sẽ tương tự như sau.

e. Kiểm tra thiết lập
Để kiểm tra xem n8n queue mode có hoạt động hay không, hãy chạy một số quy trình làm việc thử nghiệm. Sau đó bạn có thể vào lại máy chủ và kiểm tra nhật ký của các worker.
Bạn sẽ thấy nội dung tương tự như sau:

Worker started execution <number> cho biết n8n đang kéo thành công các công việc từ redis
Worker started finished <number> cho biết n8n đã hoàn thành các công việc.
f. Giám sát và bảo trì
Việc duy trì chế độ tự động hóa hàng đợi n8n là rất quan trọng để đảm bảo hiệu suất hoạt động. Dưới đây là một số điều cần lưu ý:
- Theo dõi số liệu CPU và Bộ nhớ của bạn bằng lệnh htop trong terminal.
- Chạy docker stats để kiểm tra hiệu suất của từng container.
- Sử dụng lệnh redis-cli như info memory hoặc info stats để theo dõi Redis.
Nếu bạn thấy worker quá tải có thể mở rộng mở rộng quy mô bằng cách thêm worker nếu tài nguyên máy chủ cho phép.