|
| 1 | +# Blueprint Architectural : Moteur de Rendu Réactif "Marius" |
| 2 | + |
| 3 | +## 1. Philosophie & Paradigme (Le "Pourquoi") |
| 4 | +Ce système rejette l'approche classique (JIT, SPA, intermédiation par API JSON) au profit d'une architecture **Data-Oriented Design (DOD)** et **Ahead-Of-Time (AOT)**. |
| 5 | + |
| 6 | +* **La donnée est le cache :** Le serveur n'est pas un médiateur interactif, c'est un moteur de projection. Il transforme un état SQL en un artéfact binaire (HTML). |
| 7 | +* **Déterminisme absolu :** Le temps de réponse en lecture doit être plat (soft real-time), sans Garbage Collection, limité uniquement par les I/O réseau. |
| 8 | +* **Zéro Indirection :** Suppression des couches de mapping (ORM) et de sérialisation. Les octets transitent de la base de données vers la mémoire contiguë (structs Rust) puis directement vers le buffer de sortie réseau. |
| 9 | + |
| 10 | +## 2. La Stack Technique (Le "Quoi") |
| 11 | +Chaque outil est sélectionné pour son alignement avec la réduction de l'empreinte mémoire, le contrôle CPU et le typage fort. |
| 12 | + |
| 13 | +* **Socle Système : Rust (LLVM)**. Garantit l'absence de Garbage Collector, la sécurité mémoire au moment de la compilation, et un footprint RAM minimal (~20 Mo). |
| 14 | +* **Runtime Asynchrone : Tokio**. Ordonnanceur multi-thread (Work-Stealing) pour maximiser l'usage CPU lors des I/O non-bloquants, sans l'overhead des threads OS bloquants. |
| 15 | +* **Réseau & Routing : Axum + Tower**. Serveur HTTP exploitant le typage statique de Rust pour l'extraction de données (zéro parsing manuel). Fournit les primitives système (compression Zstd/Gzip, streaming de fichiers). |
| 16 | +* **Moteur de Projection : Maud**. Macro Rust compilant les templates HTML directement en code machine. Zéro parsing au runtime. |
| 17 | +* **Protocole Client : HTMX**. Traite le navigateur comme un terminal d'affichage. Échange des fragments d'état (HTML) plutôt que des données (JSON), éliminant l'état applicatif côté client. |
| 18 | +* **Driver Data : SQLx**. Validation des requêtes SQL contre le schéma de la base de données *au moment de la compilation*. Mapping direct en structures mémoire. |
| 19 | +* **Source de Vérité : PostgreSQL**. Centralise les invariants métier. Pilote le système via des triggers et le protocole natif `LISTEN/NOTIFY`. |
| 20 | +* **Pipeline Assets : `build.rs` + `minify-js`**. Intégration AOT. Les assets (CSS/JS) sont minifiés, hashés et figés avant la compilation du binaire pour un cache navigateur immuable. |
| 21 | + |
| 22 | + |
| 23 | + |
| 24 | +## 3. Topologie du Pipeline (Le "Comment") |
| 25 | +L'architecture sépare strictement le chemin de lecture (Read Path, critique en latence) du chemin d'écriture (Write Path, critique en débit). |
| 26 | + |
| 27 | +### A. Le Chemin de Lecture (Read Path - O(1)) |
| 28 | +1. **Requête HTTP** entrante gérée par Tokio/Axum. |
| 29 | +2. **Passthrough :** Axum sert l'artéfact projeté (fichier statique ou buffer RAM) via `sendfile(2)`. |
| 30 | +3. **Résultat :** Latence microseconde (~100µs), coût CPU quasi nul. |
| 31 | + |
| 32 | +### B. Le Chemin de Mutation (Write Path & Projection Réactive) |
| 33 | +La résolution du problème d'amplification d'écriture (Write Amplification) est gérée par un pattern **Collector/Dispatcher**. |
| 34 | + |
| 35 | +1. **Mutation :** Une transaction SQL est validée (ex: `CALL content.publish_document()`). |
| 36 | +2. **Signal :** PostgreSQL émet un événement `pg_notify` contenant l'ID de l'entité. |
| 37 | +3. **Collector (Dédoublonnement) :** Un worker Tokio intercepte le signal et place l'ID dans un `HashSet` en mémoire. Plusieurs mutations rapides sur le même ID sont écrasées (DOD). |
| 38 | +4. **Dispatcher (Batching) :** Selon un invariant temporel (ex: `tick` de 500ms) ou volumétrique (ex: `len() == 100`), le `HashSet` est vidé (`flush`). |
| 39 | +5. **Projection Parallèle :** Les $N$ entités uniques sont extraites via SQLx en lot, puis projetées simultanément en HTML via Maud sur tous les cœurs CPU (via Rayon/Tokio). L'artéfact cible est mis à jour. |
| 40 | + |
| 41 | +## 4. Invariants Hybrides (Comportement Client) |
| 42 | +Bien que l'état global soit géré par le serveur, les micro-interactions locales (sans persistance requise) sont traitées en Just-In-Time (JIT) côté client. |
| 43 | +* **Règle :** Utilisation de Vanilla JS (ou outils légers) greffés sur des attributs natifs (ex: `aria-expanded`, `<details>`). |
| 44 | +* **Intégration HTMX :** Les scripts réactifs s'accrochent au hook `htmx.onLoad` pour garantir l'application du comportement aux fragments du DOM fraîchement injectés par le pipeline AOT. |
| 45 | + |
| 46 | +*** |
| 47 | + |
| 48 | +Document rédigé le 25 mars 2026. |
0 commit comments