
Soixante conteneurs sur un seul serveur
Une machine bare-metal exécute des dizaines à des centaines de conteneurs Hoody. La dédupplication KSM et BTRFS rend le coût marginal quasi nul.
Une sauvegarde Postgres de 200 Go à Francfort. Une nouvelle machine à Singapour. Vous sautez l'aller-retour S3. Un curl envoie pg_dump vers une URL Hoody Pipe ; un curl de l'autre côté streame directement dans psql. Les octets sont en vol, jamais au repos.
200 Go · zéro saut · zéro rétention
Hoody Pipe est un chemin nommé sur un serveur HTTP. L'émetteur PUT un flux dessus, le récepteur GET le même chemin, et le serveur épisse les deux ensemble. Rien n'est écrit sur disque ; le pipe retient zéro octet par conception.
Depuis la machine source, pg_dump | gzip | curl -T - vers l'URL pipe. Le corps du PUT streame aussi vite que le backpressure TCP le permet. Le serveur garde la connexion jusqu'à ce qu'un récepteur arrive sur le même chemin.
PUT /api/v1/pipe/migrationQuand le GET du récepteur arrive sur le même chemin, Hoody épisse les octets de l'upload directement dans la réponse du download. Pas de buffer, pas de staging sur disque, pas de commit asynchrone — juste un flux direct entre deux sockets HTTP.
0 octet sur disqueDepuis la machine de destination, curl GET le chemin et envoie la réponse dans gunzip | psql. Le flux côté récepteur se termine à la seconde où le dernier octet de l'émetteur arrive. Pas de retry, pas de manifeste, pas de nettoyage.
GET /api/v1/pipe/migrationL'ordre de connexion n'a pas d'importance — le récepteur peut faire curl en premier et bloquer jusqu'à ce que l'émetteur se connecte (ou inversement), jusqu'au TTL pipe de 5 minutes. Le backpressure circule de bout en bout : un psql lent freine le curl à la source. Il n'y a pas de file d'attente à déborder parce qu'il n'y a pas de file d'attente.
Ce ne sont pas du pseudo-code. Ouvrez deux terminaux sur les deux serveurs, lancez une commande sur chaque, et regardez une sauvegarde de 200 Go quitter un cloud et atterrir dans un autre.
PUT (curl -T) est préféré parce que c'est ainsi que curl veut uploader un flux. POST fonctionne à l'identique — même chemin, mêmes messages de statut. Utilisez ?n=N des deux côtés si vous devez fan-out le même dump vers plusieurs récepteurs.
Un troisième laptop ouvre la même URL pipe avec ?progress et reçoit un flux SSE en temps réel d'octets-par-seconde, ETA et récepteurs connectés. Spectateur ne consomme pas un slot de récepteur — cinquante coéquipiers peuvent regarder la migration sans changer la valeur de n ni interférer avec le transfert.
L'aller-retour S3 a l'air simple sur un tableau blanc. En production, c'est une pile de pièces mobiles qui facturent toutes à la seconde. Le pipe rassemble toute la pile dans le transport lui-même.
S3, GCS, Azure Blob — l'aller-retour existe seulement parce qu'il n'y avait pas d'autre endroit pour garer les octets. Le pipe est le chemin. Il n'y a pas de bucket à provisionner, à régler par règle de cycle de vie ni à nettoyer après.
Egress sur l'upload, egress sur le download — deux fois. Avec le pipe les octets quittent Francfort et arrivent à Singapour en un saut. Vous payez les secondes pendant lesquelles la connexion était ouverte, pas un stockage que vous supprimerez demain.
Votre monitoring comprend déjà HTTP. Votre VPN, votre pare-feu et votre journal d'audit aussi. Pas de nouvelle identité IAM, pas de nouveau SDK, pas de nouveau mode de défaillance — c'est une commande curl.
La vitesse est limitée par le maillon le plus lent de bout en bout (egress Francfort, ingress Singapour, votre fenêtre TCP). Le pipe Hoody retient zéro octet — il n'y a pas de stockage côté serveur ; le backpressure circule directement entre les deux extrémités.
Deux terminaux, une URL, pas de troisième couche de stockage.
Toute la migration a la même forme que cat file | wc -l. Le fait que les deux pipes vivent dans des centres de données différents est un détail d'implémentation de l'URL.
Tout ce qui n'existe que parce que personne n'avait un chemin HTTP qui streame. Le pipe rassemble toute la pile de migration de données dans un curl de chaque côté.
Sautez le bucket. Le transport est l'URL.