Retour au portfolio
ENESFRPT
Architecture

Faire le pont entre le cloud et le local : un modèle de file d'attente de commandes en base de données

6 min de lecture · 2026

Lorsque votre interface cloud doit imprimer une étiquette physique sur une imprimante USB installée dans un entrepôt, il vous faut une solution architecturale créative. Voici le modèle que j'ai conçu.

Le problème

Mon frontend ERP sur mesure tourne sur Retool Cloud. Mon imprimante d'étiquettes (Brother QL-700) est connectée en USB à un PC Windows dans l'entrepôt. Ma base de données (NeonDB) est dans le cloud. Quand un employé clique sur « Imprimer l'étiquette » dans Retool, une étiquette physique doit sortir d'une imprimante située à 3 000 km des serveurs de Retool.

Retool Cloud ne peut pas communiquer avec une imprimante locale. Il n'existe aucun chemin réseau direct. La redirection de port est fragile. Les VPN ajoutent de la complexité. Les webhooks exigent un point d'accès public.

Il me fallait quelque chose de plus simple et de plus fiable.

La solution : PostgreSQL comme file de commandes

L'idée clé, c'était que les deux côtés — Retool Cloud et le backend local — partageaient déjà une chose : la base de données PostgreSQL. Pourquoi ne pas l'utiliser comme courtier de messages ?

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')   │

Les détails d'ingénierie

Verrouillage exclusif

Que se passe-t-il si deux instances du backend tournent en parallèle ? Ou si le backend plante en plein milieu d'une commande ? J'ai mis en place un modèle de verrou exclusif :

Surveillance par heartbeat

Un verrou sans heartbeat, c'est un interblocage en puissance. Toutes les 30 secondes, le backend actif met à jour son horodatage last_heartbeat. Si le heartbeat est obsolète (>60 secondes), toute nouvelle instance du backend peut s'emparer du verrou — partant du principe que le détenteur précédent a planté.

Types de commandes

La file ne se limite pas à l'impression :

Récupération après échec

Les commandes peuvent échouer (imprimante hors ligne, Amazon bloquant le scraping, délai réseau dépassé). Le système gère cela :

Pourquoi cela fonctionne mieux que les alternatives

Résultats en production

Ce système tourne en production depuis plus d'un an. Il traite de manière fiable les commandes d'impression, les demandes d'enrichissement et les déclenchements d'extraction. La bascule a été testée (involontairement) à plusieurs reprises lorsque mon PC local redémarrait — le backend redémarre, récupère le verrou et reprend le traitement en moins de 60 secondes.

Le modèle est open source : github.com/AspiranteD/cloud-local-command-bridge