Salta el contingut

Escalabilitat i Producció

7.1. Queue Mode amb Redis

Configuració:

# docker-compose.yml
services:
  redis:
    image: redis:7-alpine
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data

  n8n-main:
    image: n8nio/n8n
    environment:
      - EXECUTIONS_MODE=queue
      - QUEUE_BULL_REDIS_HOST=redis
      - QUEUE_BULL_REDIS_PORT=6379
      - QUEUE_BULL_REDIS_DB=0
    ports:
      - "5678:5678"

  n8n-worker-1:
    image: n8nio/n8n
    command: worker
    environment:
      - EXECUTIONS_MODE=queue
      - QUEUE_BULL_REDIS_HOST=redis

  n8n-worker-2:
    image: n8nio/n8n
    command: worker
    environment:
      - EXECUTIONS_MODE=queue
      - QUEUE_BULL_REDIS_HOST=redis

  n8n-worker-3:
    image: n8nio/n8n
    command: worker
    environment:
      - EXECUTIONS_MODE=queue
      - QUEUE_BULL_REDIS_HOST=redis

Avantatges: - ✅ Execucions distribuïdes - ✅ Alta disponibilitat - ✅ Escalat horitzontal (afegir workers) - ✅ Isolation (worker crashes no afecten altres)

7.2. Optimització de workflows

Best practices:

1. Batch processing:

❌ Mal: 10,000 HTTP requests individuals
✅ Bé: Split In Batches: 100 → 100 requests de 100 items

2. Caching:

[Check Redis Cache]
  ↓ miss
[Fetch from API] (slow)
[Store in Cache: TTL 3600s]
[Use cached data] (fast)

3. Parallel execution:

[Main Flow]
  ├─ [Branch 1: Process A] ─┐
  ├─ [Branch 2: Process B] ─┤
  └─ [Branch 3: Process C] ─┴─> [Merge Results]

4. Evitar nested loops:

❌ Mal:
[Loop 1000 users]
  └─> [Loop 100 orders per user] = 100,000 iterations

✅ Bé:
[Get all orders for all users: 1 query]
  └─> [Group by user: 1 operation]

7.3. Monitoratge

Mètriques clau:

// Workflow execution metrics
{
  workflow_id: "abc123",
  execution_id: "exec_456",
  start_time: "2026-02-09T10:00:00Z",
  end_time: "2026-02-09T10:05:23Z",
  duration_ms: 323000,
  status: "success", // or "error"
  nodes_executed: 12,
  items_processed: 5000,
  error_count: 0,
  retry_count: 1
}

Alertes:

[Workflow Complete]
[IF: Duration > 5min OR Errors > 0]
  ↓ true
[Slack: Alert DevOps]
  Message: "⚠️ Workflow {{$workflow.name}} took {{$json.duration}}ms"
[PagerDuty: Create Incident]

Log streaming:

environment:
  - N8N_LOG_LEVEL=info
  - N8N_LOG_OUTPUT=file
  - N8N_LOG_FILE_LOCATION=/var/log/n8n/

# Filebeat config
filebeat.inputs:
- type: log
  paths:
    - /var/log/n8n/*.log

output.elasticsearch:
  hosts: ["elasticsearch:9200"]

7.4. CI/CD

Export workflows:

# Exportar workflow
curl -X GET http://localhost:5678/api/v1/workflows/123 \
  -H "X-N8N-API-KEY: $API_KEY" > workflow.json

# Importar workflow
curl -X POST http://localhost:5678/api/v1/workflows \
  -H "X-N8N-API-KEY: $API_KEY" \
  -H "Content-Type: application/json" \
  -d @workflow.json

Git integration:

# Structure
repo/
├── workflows/
   ├── etl_sales_daily.json
   ├── sync_customers.json
   └── reports_weekly.json
├── credentials/ (encrypted)
└── .github/workflows/
    └── deploy.yml

# GitHub Actions
name: Deploy N8N Workflows
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Deploy to N8N
        run: |
          for workflow in workflows/*.json; do
            curl -X POST $N8N_URL/api/v1/workflows \
              -H "X-N8N-API-KEY: ${{ secrets.N8N_API_KEY }}" \
              -d @$workflow
          done