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
Laisser un commentaire