Voltar ao portfólio
ENESFRPT
Arquitetura

Ligar a Cloud ao Local: Um Padrão de Fila de Comandos em Base de Dados

6 min de leitura · 2026

Quando a interface na cloud precisa de imprimir uma etiqueta física numa impressora USB instalada num armazém, é necessária uma solução arquitetónica criativa. Eis o padrão que construí.

O Problema

O frontend do meu ERP personalizado corre na Retool Cloud. A minha impressora de etiquetas (Brother QL-700) está ligada por USB a um PC Windows no armazém. A minha base de dados (NeonDB) está na cloud. Quando um colaborador clica em "Imprimir Etiqueta" na Retool, tem de sair uma etiqueta física de uma impressora situada a 3000 km dos servidores da Retool.

A Retool Cloud não consegue comunicar com uma impressora local. Não há um caminho de rede direto. O port forwarding é frágil. As VPN acrescentam complexidade. Os webhooks exigem um endpoint público.

Eu precisava de algo mais simples e mais fiável.

A Solução: PostgreSQL como Fila de Comandos

A ideia-chave foi que ambos os lados — a Retool Cloud e o backend local — já partilhavam uma coisa: a base de dados PostgreSQL. Porque não usá-la como message broker?

Retool Cloud                     NeonDB (PostgreSQL)
    │                                    │
    │  INSERT INTO                       │
    │  extraction_command_queue           │
    │  (type='print', payload=...)       │
    │ ──────────────────────────────────→ │
    │                                    │
    │                                    │  ← POLL every 5s
    │                                    │     (SELECT ... WHERE
    │                                    │      status='pending')
    │                                    │
    │                     Local Backend (Windows)
    │                           │
    │                           │  Process command
    │                           │  Download label PDF
    │                           │  Send to Brother QL-700
    │                           │  UPDATE status='completed'
    │                           │
    │  ← Query result           │
    │    (status='completed')   │

Os Detalhes de Engenharia

Bloqueio Exclusivo

E se estiverem duas instâncias do backend a correr? Ou se o backend falhar a meio de um comando? Implementei um padrão de bloqueio exclusivo:

Monitorização por Heartbeat

Um bloqueio sem heartbeat é um deadlock à espera de acontecer. A cada 30 segundos, o backend ativo atualiza o seu timestamp last_heartbeat. Se o heartbeat estiver desatualizado (>60 segundos), qualquer nova instância do backend pode tomar o bloqueio — partindo do pressuposto de que o detentor anterior falhou.

Tipos de Comando

A fila trata de mais do que apenas a impressão:

Recuperação de Falhas

Os comandos podem falhar (impressora offline, Amazon a bloquear o scraping, timeout de rede). O sistema lida com isto:

Porque é que Isto Funciona Melhor do que as Alternativas

Resultados em Produção

Este sistema está em produção há mais de um ano. Processa comandos de impressão, pedidos de enriquecimento e acionamentos de extração de forma fiável. O failover foi testado (involuntariamente) várias vezes, quando o meu PC local reiniciou — o backend reinicia, reivindica o bloqueio e retoma o processamento em menos de 60 segundos.

O padrão é de código aberto: github.com/AspiranteD/cloud-local-command-bridge