Feature #549
ferméInstallation en local de RabbitMQ
100%
Mis à jour par Johary RALAIHARIJAONA il y a un jour
- Statut changé de Nouveau à In Progress / En cours
Mis à jour par Johary RALAIHARIJAONA il y a environ 24 heures
- Statut changé de In Progress / En cours à Clos
┌──────────────────┐
│ FLUX DE PAIEMENT │
└──────────────────┘
1- CLIENT fait un paiement Mobile Money
↓
2- SERVEUR YAS 1 ou 2
- Reçoit notification webhook du PSP (Airtel/Orange)
- Valide le paiement
- Au lieu de MAJ directe du solde
- Envoie message à RabbitMQ
↓
3 - RABBITMQ (Queue: solde_updates) - Stocke les messages de manière durable
- Garantit l'ordre FIFO
- 1 seul consommateur (prefetch=1)
↓
4 - WORKER VPI-SOLDE (processus séparé) - Consomme les messages UN PAR UN
- Lock PostgreSQL (FOR UPDATE)
- Met à jour le solde de manière atomique
- Acknowledge le message après succès
↓
5- BASE DE DONNÉES PostgreSQL - Solde mis à jour correctement
- Transaction enregistrée avec soldeAvant/soldeApres
YAS/
├── services/rabbitmq/
│ └── rabbitmqService.js # Publisher RabbitMQ
├── controllers/api/mobileMoney/
│ └── mobileMoneyChoiceController.js # Appelle publishSoldeUpdate()
├── app.js # Initialise RabbitMQ au démarrage
└── test_rabbitmq_airtel_simulation.js # Script de test
vpi-solde-worker/
├── index.js # Point d'entrée du worker
├── services/
│ ├── rabbitmqService.js # Consumer RabbitMQ
│ └── databaseService.js # Mise à jour solde avec lock
├── .env # Configuration
└── package.json
┌──────────────────────┐
│ FLUX RABBITMQ COMPLET │
└──────────────────────┘
1- YAS reçoit webhook Airtel Money
↓
2- YAS : publishSoldeUpdate()
├─ Crée objet message
├─ Convertit en Buffer (JSON → binaire)
├─ sendToQueue('solde_updates', buffer, {persistent: true})
└─ Attend confirmation de RabbitMQ
↓
3- RabbitMQ reçoit le message
├─ Écrit sur disque (persistent: true)
├─ Envoie confirmation à YAS
└─ Stocke dans queue 'solde_updates'
↓
4- RabbitMQ → Worker (si prefetch permet)
├─ Envoie 1 message (prefetch = 1)
└─ Attend ack() avant d'envoyer le suivant
↓
5- Worker reçoit le message
├─ Parse JSON
├─ Appelle callback(data, msg)
└─ Traite le message
↓
6- Worker : updateSolde()
├─ BEGIN transaction PostgreSQL
├─ SELECT ... FOR UPDATE (lock)
├─ UPDATE solde
├─ UPDATE transaction
└─ COMMIT
↓
7- Worker : ack(msg)
└─ RabbitMQ supprime le message
↓
8- RabbitMQ envoie le message suivant
└─ Retour à l'étape 4