Tenho uma configuração de n8n auto-hospedada onde workflows processam jobs armazenados em PostgreSQL. Estou usando múltiplos workers, e às vezes um worker falha ou perde a conexão enquanto processa um job.
O problema é que o job pode permanecer em processamento mesmo que o worker nunca o tenha concluído. Se eu simplesmente tentar novamente todos os jobs falhados, fico preocupado com dois workers processando o mesmo job simultaneamente.
Minha tabela atual se parece com:
CREATE TABLE jobs (
id BIGSERIAL PRIMARY KEY,
status TEXT NOT NULL,
locked_at TIMESTAMP,
worker_id TEXT,
updated_at TIMESTAMP DEFAULT NOW()
);
Estou considerando reivindicar jobs usando:
UPDATE jobs
SET
status = ‘processing’,
locked_at = NOW(),
worker_id = $1
WHERE id = $2
AND status = ‘pending’
RETURNING *;
Depois, periodicamente, redefinir jobs onde locked_at é mais antigo que um certo limite
Qual seria o padrão mais seguro em produção para reivindicação de jobs, falhas de workers e retries em n8n + PostgreSQL?
Seria SELECT … FOR UPDATE SKIP LOCKED melhor aqui, e como você evitaria que um worker recuperado/obsoleto atualizasse um job que já foi pego por outro worker?
Descreva o problema/erro/pergunta
Qual é a mensagem de erro (se houver)?
Por favor, compartilhe seu workflow
(Selecione os nós em sua tela e use os atalhos de teclado CMD+C/CTRL+C e CMD+V/CTRL+V para copiar e colar o workflow.)
Compartilhe a saída retornada pelo último nó
Informações sobre sua configuração de n8n
- Versão do n8n:
- Banco de dados (padrão: SQLite):
- Configuração n8n EXECUTIONS_PROCESS (padrão: own, main):
- Executando n8n via (Docker, npm, n8n cloud, app desktop):
- Sistema operacional: