Socle V004 – Architecture

Socle V004 - Architecture

02 – Architecture du Socle V4

Version : 4.0.0 Date : 2025-01-25

1. Vue d’ensemble

┌─────────────────────────────────────────────────────────────────┐
│                         SOCLE V4                                │
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │                    MOP (inchangé)                        │   │
│  │  - Orchestration Workers                                 │   │
│  │  - Lifecycle management                                  │   │
│  │  - Scheduling doWork()                                   │   │
│  └─────────────────────────────────────────────────────────┘   │
│                              │                                  │
│  ┌───────────┬───────────┬───┴───────┬─────────────┐           │
│  │           │           │           │             │           │
│  ▼           ▼           ▼           ▼             ▼           │
│ ┌─────┐  ┌───────┐  ┌────────┐  ┌─────────┐  ┌──────────┐     │
│ │KvBus│  │Shared │  │Supervi-│  │ HTTP    │  │ Workers  │     │
│ │     │  │Data   │  │sor     │  │ Worker  │  │ métier   │     │
│ └─────┘  └───────┘  └────────┘  └─────────┘  └──────────┘     │
│                                                                 │
│  ════════════════════ NOUVEAUTÉS V4 ════════════════════════   │
│                                                                 │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────┐     │
│  │ H2 TechDB   │  │ Log4j2 +    │  │ Clients centraux    │     │
│  │ (embarqué)  │  │ LogForwarder│  │ - SocleAuthClient   │     │
│  │             │  │             │  │ - WorkerRegistry    │     │
│  └─────────────┘  └─────────────┘  └─────────────────────┘     │
│                                                                 │
│  ┌─────────────┐  ┌─────────────────────────────────────┐      │
│  │ Status      │  │ Pipeline V2                          │      │
│  │ Dashboard   │  │ (Queue/Claim/Ack, DLQ, at-least-once)│      │
│  │ (port 9374) │  │                                      │      │
│  └─────────────┘  └─────────────────────────────────────┘      │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

2. Architecture en couches

┌─────────────────────────────────────────────────────────────────┐
│                    COUCHE APPLICATION                           │
│  Workers métier + Contrôleurs REST                              │
├─────────────────────────────────────────────────────────────────┤
│                    COUCHE FRAMEWORK (SOCLE)                     │
│  MOP + Core Components + Nouveautés V4                          │
├─────────────────────────────────────────────────────────────────┤
│                    COUCHE INFRASTRUCTURE                        │
│  Tomcat (HTTP), H2 (TechDB), Redis (KV), Kafka/NATS (Msg)      │
└─────────────────────────────────────────────────────────────────┘

3. Structure des packages

eu.lmvi.socle/
│
│  ══════ COMPOSANTS V3 (conservés) ══════
├── mop/
│   └── MainOrchestratorProcess.java    # Orchestrateur central
├── worker/
│   └── Worker.java                     # Interface de base
├── config/
│   └── SocleConfiguration.java         # Configuration centralisée
├── kv/
│   ├── KvBus.java                      # Abstraction KV
│   ├── KvImplementation.java           # Interface implémentation
│   ├── InMemoryKvImplementation.java   # Implémentation mémoire
│   └── RedisKvImplementation.java      # Implémentation Redis
├── shared/
│   └── SharedDataRegistry.java         # Registre données partagées
├── supervisor/
│   └── Supervisor.java                 # Monitoring heartbeats
├── http/
│   ├── HttpWorker.java                 # Worker HTTP
│   ├── TomcatManager.java              # Gestion Tomcat
│   └── GracefulShutdownFilter.java     # Filtre drain
├── admin/
│   └── AdminRestApi.java               # API REST admin
├── metrics/
│   └── SocleMetrics.java               # Métriques
├── pipeline/
│   └── PipelineEngine.java             # Traitement asynchrone
├── resilience/
│   ├── CircuitBreaker.java             # Circuit Breaker
│   └── RetryExecutor.java              # Retry avec backoff
├── scheduler/
│   ├── WorkerScheduler.java            # Scheduler
│   └── CronExpression.java             # Parser cron
├── security/
│   ├── AdminAuthFilter.java            # Auth admin
│   └── RateLimitFilter.java            # Rate limiting
│
│  ══════ NOUVEAUX COMPOSANTS V4 ══════
├── techdb/
│   ├── TechDbManager.java              # Gestionnaire H2
│   ├── TechDbConfig.java               # Configuration Spring
│   └── TechDbRepository.java           # Repository
├── logging/
│   ├── SocleLogForwarderAppender.java  # Appender Log4j2
│   ├── LogTransport.java               # Interface transport
│   ├── HttpLogTransport.java           # Transport HTTP
│   ├── NatsLogTransport.java           # Transport NATS
│   └── H2FallbackStorage.java          # Fallback H2
└── client/
    ├── auth/
    │   ├── SocleAuthClient.java        # Interface auth
    │   ├── AuthTokenManager.java       # Gestion tokens
    │   └── AuthTokens.java             # DTO tokens
    └── registry/
        ├── WorkerRegistryClient.java   # Client registry
        ├── WorkerRegistration.java     # DTO registration
        └── WorkerHeartbeat.java        # DTO heartbeat

4. Flux de démarrage

1. Spring Boot initialise
2. SocleConfiguration charge la config (.env + YAML)
3. Spring crée les beans @Component
4. MOP.start() appelé (ApplicationReadyEvent)
   │
   ├── 4.1 [V4] TechDbManager.initialize()
   │         └── Création tables H2
   │         └── Restauration offsets
   │
   ├── 4.2 [V4] SocleAuthClient.login()
   │         └── Obtention JWT
   │
   ├── 4.3 [V4] WorkerRegistryClient.register()
   │         └── Enregistrement au Registry
   │
   ├── 4.4 SharedDataRegistry.initialize()
   ├── 4.5 KvBus.initialize()
   ├── 4.6 Supervisor.start()
   ├── 4.7 Metrics.start()
   │
   ├── 4.8 Workers triés par START_PRIORITY
   │   └── Pour chaque worker:
   │       ├── worker.initialize()
   │       ├── worker.start()
   │       ├── Register avec Supervisor
   │       └── Schedule si isScheduled()
   │
   ├── 4.9 HttpWorker.start() [priorité 1000 = dernier]
   └── 4.10 Boucle principale doWork()

5. Flux de shutdown

1. Signal SIGTERM (ou /admin/shutdown)
2. MOP.stop() appelé
3. État → DRAINING
   │
   ├── 3.1 HttpWorker.startDraining()
   │         └── Refuse nouvelles connexions
   ├── 3.2 HttpWorker.awaitDrain(timeout)
   │         └── Attente requêtes en cours
   │
   ├── 3.3 Workers par STOP_PRIORITY (petit = premier)
   │   ├── HttpWorker.stop() [priorité 0]
   │   └── Autres workers [priorités 1-999]
   │
   ├── 3.4 [V4] WorkerRegistryClient.unregister()
   ├── 3.5 [V4] TechDbManager.close()
   │
   ├── 3.6 Supervisor.shutdown()
   ├── 3.7 SharedData.close()
   └── 3.8 État → STOPPED

6. Dépendances entre composants

┌──────────────────────────────────────────────────────────────┐
│                        MOP (orchestrateur)                    │
│                              │                                │
│         ┌────────────────────┼────────────────────┐          │
│         │                    │                    │          │
│         ▼                    ▼                    ▼          │
│   ┌───────────┐       ┌───────────┐       ┌───────────┐     │
│   │ TechDB    │◄──────│ Supervisor│───────►│ Workers   │     │
│   │ Manager   │       │           │        │           │     │
│   └─────┬─────┘       └─────┬─────┘        └─────┬─────┘     │
│         │                   │                    │           │
│         │                   ▼                    │           │
│         │            ┌───────────┐               │           │
│         │            │ Worker    │◄──────────────┘           │
│         │            │ Registry  │                           │
│         │            │ Client    │                           │
│         │            └─────┬─────┘                           │
│         │                  │                                 │
│         ▼                  ▼                                 │
│   ┌───────────┐     ┌───────────┐                           │
│   │ H2        │     │ SocleAuth │                           │
│   │ Database  │     │ Client    │                           │
│   └───────────┘     └─────┬─────┘                           │
│                           │                                  │
│                           ▼                                  │
│                    ┌─────────────┐                           │
│                    │ LogForwarder│──► HTTP/NATS (sortant)   │
│                    │ Appender    │                           │
│                    └─────────────┘                           │
└──────────────────────────────────────────────────────────────┘

7. Architecture du Logging V4

┌─────────────────────────────────────────────────────────────┐
│                      Application                             │
│                                                              │
│  Logger.info("message")                                      │
│         │                                                    │
│         ▼                                                    │
│  ┌─────────────────────────────────────────────────────┐    │
│  │              Log4j2 AsyncLoggers                     │    │
│  │              (LMAX Disruptor)                        │    │
│  └────────────────────┬────────────────────────────────┘    │
│                       │                                      │
│         ┌─────────────┼─────────────┐                       │
│         ▼             ▼             ▼                       │
│  ┌───────────┐ ┌───────────┐ ┌─────────────────────┐       │
│  │  Console  │ │  File     │ │ SocleLogForwarder   │       │
│  │  Appender │ │  Appender │ │ Appender            │       │
│  └───────────┘ └───────────┘ └──────────┬──────────┘       │
│                                         │                   │
└─────────────────────────────────────────┼───────────────────┘
                                          │
                    ┌─────────────────────┴─────────────────────┐
                    │                                           │
                    ▼                                           ▼
            ┌──────────────┐                           ┌──────────────┐
            │ HTTP Transport│                           │ NATS Transport│
            │ → LogHub     │                           │ → JetStream  │
            └──────┬───────┘                           └──────┬───────┘
                   │                                          │
                   │  (si échec)                              │
                   ▼                                          │
            ┌──────────────┐                                  │
            │ H2 Fallback  │◄─────────────────────────────────┘
            │ Storage      │
            └──────────────┘

8. Patterns de conception

Pattern Composant Usage
Orchestrator MOP Orchestre tout le lifecycle
Observer KvBus pub/sub Communication inter-workers
Strategy KvImplementation In-memory ou Redis
Registry SharedDataRegistry État partagé
Circuit Breaker CircuitBreaker Résilience pannes
Factory Spring DI Création composants
Builder Configuration Construction config

9. Thread Safety

Mécanisme Usage
ConcurrentHashMap Maps partagées
AtomicLong/Boolean Compteurs atomiques
ReentrantReadWriteLock Opérations complexes
BlockingQueue Queues thread-safe
CompletableFuture Opérations async
ScheduledExecutorService Scheduling
LMAX Disruptor Ring buffer logging

10. Points d’extension

Créer un nouveau Worker

@Component
public class MonWorker implements Worker {
    // Implémenter l'interface Worker
}

Ajouter une implémentation KvBus

public class MonKvImplementation implements KvImplementation {
    // Implémenter l'interface
}

Créer un Pipeline Stage

public class MonStage implements PipelineStage<MonType> {
    // Implémenter le traitement
}

11. Références

Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *