feat(broker): RabbitMQ + MassTransit job broker pour l'analyse inter-sites (Fixes #72) #176

Merged
nonobis merged 1 commit from feat/feat-broker-de-jobs-d-analyse-rabbitmq-masstransit into main 2026-08-28 01:11:12 +02:00
Owner

Contexte

Mutualiser les ressources IA/GPU entre sites via un broker de jobs durable. Un site sans GPU peut déléguer l'analyse de ses frames à des agents équipés GPU sur un autre site physique.

Architecture retenue : RabbitMQ + MassTransit (solution B — agents producteurs/consommateurs en sortie NAT, connexion AMQP sortante vers le broker central).

Tickets liés

Changements

  • Heimdall.Contracts : nouveau projet shared avec les contrats de messages (AnalysisJobRequested, AnalysisJobCompleted, AnalysisJobFailed)
  • RabbitMQ : conteneur rabbitmq:3-management ajouté au docker-compose (dev + prod), credentials via env vars
  • MassTransit Central (Web) : publication de jobs d'analyse via IPublishEndpoint
  • MassTransit Agent : consommateur AnalysisJobConsumer — processe les jobs reçus, exécute l'inférence locale, publie le résultat
  • Backpressure : ConcurrentMessageLimit=1 côté agent pour ne pas surcharger le GPU
  • Env vars : RABBITMQ__HOST, RABBITMQ__PORT, RABBITMQ__USER, RABBITMQ__PASSWORD pour les deux services

Architecture

Central (Web)                    Agent (GPU)
  │                                │
  ├─ Publish(AnalysisJobRequested)─┤
  │                                ├─ Consume → AnalyzeFrameAsync
  │                                ├─ Publish(AnalysisJobCompleted)
  │  ←─────────────────────────────┘
  │
  ├─ Consume(AnalysisJobCompleted) → Update job status
  └─ Consume(AnalysisJobFailed) → Retry / dead-letter

Tests

  • dotnet build : 0 erreur, 0 warning
  • dotnet format whitespace : aucun formatage nécessaire

Notes

  • Le consommateur est registré avec ConcurrentMessageLimit=1 pour limiter la charge GPU
  • Les agents restent derrière leurs NAT — connexion AMQP sortante uniquement (pas de port entrant)
  • Les credentials RabbitMQ sont dans les env vars (defaults pour dev)
  • Le broker est le socle : les tickets suivants (#76 Agent GPU worker) viendront s'enchainer dessus
## Contexte Mutualiser les ressources IA/GPU entre sites via un broker de jobs durable. Un site sans GPU peut déléguer l'analyse de ses frames à des agents équipés GPU sur un autre site physique. **Architecture retenue :** RabbitMQ + MassTransit (solution B — agents producteurs/consommateurs en sortie NAT, connexion AMQP sortante vers le broker central). ## Tickets liés - Fixes #72 ## Changements - **Heimdall.Contracts** : nouveau projet shared avec les contrats de messages (`AnalysisJobRequested`, `AnalysisJobCompleted`, `AnalysisJobFailed`) - **RabbitMQ** : conteneur `rabbitmq:3-management` ajouté au docker-compose (dev + prod), credentials via env vars - **MassTransit Central (Web)** : publication de jobs d'analyse via `IPublishEndpoint` - **MassTransit Agent** : consommateur `AnalysisJobConsumer` — processe les jobs reçus, exécute l'inférence locale, publie le résultat - **Backpressure** : `ConcurrentMessageLimit=1` côté agent pour ne pas surcharger le GPU - **Env vars** : `RABBITMQ__HOST`, `RABBITMQ__PORT`, `RABBITMQ__USER`, `RABBITMQ__PASSWORD` pour les deux services ## Architecture ``` Central (Web) Agent (GPU) │ │ ├─ Publish(AnalysisJobRequested)─┤ │ ├─ Consume → AnalyzeFrameAsync │ ├─ Publish(AnalysisJobCompleted) │ ←─────────────────────────────┘ │ ├─ Consume(AnalysisJobCompleted) → Update job status └─ Consume(AnalysisJobFailed) → Retry / dead-letter ``` ## Tests - `dotnet build` : 0 erreur, 0 warning - `dotnet format whitespace` : aucun formatage nécessaire ## Notes - Le consommateur est registré avec `ConcurrentMessageLimit=1` pour limiter la charge GPU - Les agents restent derrière leurs NAT — connexion AMQP sortante uniquement (pas de port entrant) - Les credentials RabbitMQ sont dans les env vars (defaults pour dev) - Le broker est le socle : les tickets suivants (#76 Agent GPU worker) viendront s'enchainer dessus
feat(broker): add RabbitMQ + MassTransit job broker for cross-site analysis (Fixes #72)
Some checks failed
CI / Docker + Trivy (pull_request) Has been skipped
CI / Détection changements (pull_request) Successful in 7s
CI / OWASP Dependency-Check (pull_request) Successful in 5m49s
CI / Docker PR (pull_request) Failing after 11m8s
Auto-Fix / Auto-Fix (pull_request) Successful in 13m32s
CI / Build + Format (pull_request) Successful in 15m5s
CI / Tests DB (Infrastructure) (pull_request) Has been skipped
CI / Tests DB (Integration) (pull_request) Has been skipped
CI / Tests Web (bUnit) (pull_request) Failing after 6m50s
CI / SonarQube (pull_request) Successful in 12m4s
CI / Tests unitaires (pull_request) Failing after 1m33s
CI / Résumé tests (PR) (pull_request) Successful in 3s
CI / ci (pull_request) Failing after 0s
962bb153c0

🤖 Résumé des tests

Tests unitaires

Pas de résultats (job skippé)


Tests Web (bUnit)

Pas de résultats


Tests DB (Infrastructure)

Skippé (aucun changement DB/Domain)

Généré automatiquement par la CI.

## 🤖 Résumé des tests ## Tests unitaires _Pas de résultats (job skippé)_ --- ## Tests Web (bUnit) _Pas de résultats_ --- ## Tests DB (Infrastructure) _Skippé (aucun changement DB/Domain)_ _Généré automatiquement par la CI._

🤖 Résumé des tests

Tests unitaires

Pas de résultats (job skippé)


Tests Web (bUnit)

Pas de résultats


Tests DB (Infrastructure)

Skippé (aucun changement DB/Domain)

Généré automatiquement par la CI.

## 🤖 Résumé des tests ## Tests unitaires _Pas de résultats (job skippé)_ --- ## Tests Web (bUnit) _Pas de résultats_ --- ## Tests DB (Infrastructure) _Skippé (aucun changement DB/Domain)_ _Généré automatiquement par la CI._
nonobis deleted branch feat/feat-broker-de-jobs-d-analyse-rabbitmq-masstransit 2026-08-28 01:11:13 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
nonobis/Heimdall!176
No description provided.