Développement
Article populaire

Microservices NestJS : Architecture d'une plateforme médicale

Équipe Wapiki
20 Janvier 2026
9 min de lecture
NestJSMicroservicesPostgreSQLMongoDBRedis

Pourquoi les microservices pour Keneya ?

Une plateforme médicale doit être scalable, résiliente et modulaire. Les microservices nous permettent :

  • Déploiement indépendant de chaque service
  • Scaling ciblé selon la charge
  • Technologies différentes par service
  • Isolation des pannes
  • Architecture globale

    Keneya est composé de 7 microservices :

    Services principaux

  • **Auth Service** : Authentification JWT, refresh tokens
  • **User Service** : Gestion patients et médecins
  • **Consultation Service** : Téléconsultations et rendez-vous
  • **Medical Records Service** : Dossiers médicaux
  • **Payment Service** : Orange Money, Moov Money
  • **Notification Service** : SMS, emails, push
  • **WebRTC Signaling Service** : Signalisation vidéo
  • Communication entre services

    1. REST API via API Gateway

    typescript
    // api-gateway/src/main.ts
    import { NestFactory } from '@nestjs/core'
    import { AppModule } from './app.module'
    
    async function bootstrap() {
      const app = await NestFactory.create(AppModule)
    
      // Proxy vers les microservices
      app.setGlobalPrefix('api/v1')
    
      await app.listen(3000)
    }

    2. Event-driven avec Redis Pub/Sub

    typescript
    // consultation.service.ts
    async completeConsultation(consultationId: string) {
      const consultation = await this.consultationRepo.findById(consultationId)
      consultation.status = 'completed'
      await consultation.save()
    
      // Publier un événement
      await this.redisClient.publish('consultation.completed', {
        consultationId,
        patientId: consultation.patientId,
        doctorId: consultation.doctorId
      })
    }
    
    // medical-records.service.ts - Abonné
    this.redisClient.subscribe('consultation.completed')
    this.redisClient.on('message', async (channel, message) => {
      if (channel === 'consultation.completed') {
        const data = JSON.parse(message)
        // Mettre à jour le dossier médical automatiquement
        await this.updateMedicalRecord(data)
      }
    })

    3. Temps réel avec Socket.io

    typescript
    // notification.gateway.ts
    @WebSocketGateway({ namespace: 'notifications' })
    export class NotificationGateway {
      @WebSocketServer() server: Server
    
      async sendToUser(userId: string, notification: any) {
        this.server.to(`user:${userId}`).emit('notification', notification)
      }
    }

    Stratégie de données

    PostgreSQL pour les données critiques

  • Utilisateurs, médecins
  • Consultations, rendez-vous
  • Transactions financières
  • MongoDB pour les documents

  • Dossiers médicaux (flexibles)
  • Historique des consultations
  • Documents scannés (références)
  • Redis pour le cache

  • Sessions utilisateurs
  • Rate limiting
  • Cache de requêtes fréquentes
  • Déploiement avec Docker Compose

    yaml
    version: '3.8'
    services:
      auth-service:
        build: ./services/auth
        environment:
          - DATABASE_URL=postgresql://...
          - REDIS_URL=redis://redis:6379
        depends_on:
          - postgres
          - redis
    
      consultation-service:
        build: ./services/consultation
        environment:
          - DATABASE_URL=postgresql://...
          - MONGO_URL=mongodb://mongo:27017
        depends_on:
          - postgres
          - mongo

    Résultats

  • 🚀 **Déploiements** : 20+ par semaine
  • ⚡ **Disponibilité** : 99.8%
  • 📈 **Scaling** : Auto-scaling sur consultation-service
  • 🔧 **Maintenance** : Services isolés, zéro downtime
  • Conclusion

    Les microservices ajoutent de la complexité, mais pour une plateforme comme Keneya, les bénéfices en scalabilité et résilience valent largement l'investissement.


    *Besoin d'aide pour architecturer votre plateforme ? [Contactez-nous](/contact).*

    Cet article vous a plu ?

    Partagez-le avec votre réseau !