FEAT: Broker de jobs d'analyse — RabbitMQ + MassTransit (mutualisation IA/GPU inter-sites) #72
Labels
No labels
bug
chore
design
dx:ci
dx:database
dx:dotnet
dx:infra
dx:security
dx:tests
dx:ui
etape-1
etape-2
etape-3
etape-4
etape-5
etape-6
etape-7
feature
priority-high
priority-low
priority-medium
security
spec
tech-debt
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
nonobis/Heimdall#72
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
🎯 Contexte
Objectif produit : mutualiser les ressources IA/GPU entre sites. Un site sans GPU doit pouvoir déléguer l'analyse de ses frames à des agents équipés GPU, même sur un autre site physique. Ce broker est le socle, extensible à toute opération déléguable (YOLO, OCR plaque, encodage clip, agrégation).
Décision d'architecture (vérifiée — fiche KB-HEIMDALL-ORLEANS du 12/08/2026) : Microsoft.Orleans est écarté — non-goal déclaré par les mainteneurs (pas de connexion directe de tiers au cluster ; TCP direct entre silos requis ; détection de panne WAN inadaptée : un silo déclaré mort se tue lui-même ; multi-clustering retiré depuis v2 et epic #7485 non livré depuis 2022). Les agents Heimdall sont derrière des NAT différents → le pattern passerelle actuel (HTTPS heartbeat) est le bon, et la mutualisation passe par une file de jobs durable : RabbitMQ + MassTransit (solution B retenue). Les agents restent producteurs/consommateurs en sortie NAT (connexion AMQP sortante vers le broker central), aucun port entrant à ouvrir.
🔍 État actuel (vérifié dans le code)
Analyse 100 % locale aujourd'hui : l'agent capture (CameraStreamService → SnapshotPipelineService) et appelle
FrameAnalyzerService.AnalyzeFrameAsync(stubRunInference→[], pas encore d'inférence réelle — cf. ticket #2). Le central orchestre l'assignation caméras→agents via Hangfire (heartbeat-monitor,agent-failover/1 min) et pousse la config par pull HTTPS (ConfigReceiverService). Aucune file de messages dans le stack (aucun conteneur RabbitMQ, aucun package MassTransit).🧩 À faire
rabbitmq:3-managementau docker-compose (dev + prod) : user/vhost dédiés Heimdall, credentials via secrets/env, port management exposé au central uniquementMassTransit+MassTransit.RabbitMQau projet Web (central) et au projet AgentHeimdall.Contractsou dossier commun) :AnalysisJobRequested,AnalysisJobCompleted,AnalysisJobFailed,AnalysisJobCancelled(+ enveloppe : JobId, SiteId, CameraId, OperationType, Priority, PayloadRef, Timestamps)IAnalysisJobQueue(publish/subscribe) pour testabilité — l'implémentation RabbitMQ/MassTransit est derrière l'interfaceAnalysisJobCompleted) et les relier aux événements caméra existants (reporting détections)ConfigReceiverService) avec fallback local🧪 Critères d'acceptation
make testvert📁 Fichiers concernés
docker/docker-compose.yml, docker/docker-compose.prod.yml, src/Heimdall.Contracts/ (nouveau), src/Heimdall.Web/Program.cs, src/Heimdall.Web/appsettings.json, src/Heimdall.Agent/Program.cs, src/Heimdall.Infrastructure/ (config bus + services), tests/
⚠️ Impact
Ajoute un point d'infrastructure central (RabbitMQ) — à sécuriser (credentials), sauvegarder et surveiller. Risque de régression faible : l'existant (Hangfire, SignalR, heartbeat) reste inchangé tant que les agents ne basculent pas en mode remote.
📝 Notes
Dépend de : ticket #2 (inférence réelle) pour que les jobs produisent des détections ; tickets capacités GPU + ordonnanceur pour le routage ; ticket docker GPU pour que les consommateurs aient accès au matériel. Fiche de recherche :
~/.hermes/profiles/the-librarian/cache/fiches/KB-HEIMDALL-ORLEANS/.