๐Ÿ›๏ธ Data Architecture Patterns & Decision Making

Bienvenue dans ce module oรน tu vas apprendre ร  concevoir des architectures data et ร  prendre des dรฉcisions techniques รฉclairรฉes. Cโ€™est le passage du โ€œje sais coderโ€ ร  โ€œje sais architecturerโ€.


Prรฉrequis

Niveau Compรฉtence
โœ… Requis Tous les modules prรฉcรฉdents (M01-M33)
โœ… Requis Expรฉrience sur des projets data rรฉels
๐Ÿ’ก Recommandรฉ Avoir รฉtรฉ confrontรฉ ร  des choix dโ€™architecture

๐ŸŽฏ Objectifs du module

ร€ la fin de ce module, tu seras capable de :

  • Connaรฎtre les patterns dโ€™architecture data majeurs
  • Appliquer un framework de dรฉcision structurรฉ
  • Rรฉdiger des Architecture Decision Records (ADR)
  • Faire du capacity planning rรฉaliste
  • ร‰viter les anti-patterns classiques
  • Adapter lโ€™architecture au contexte (startup vs enterprise)

1. Introduction : Lโ€™Art de lโ€™Architecture Data

1.1 Quโ€™est-ce quโ€™un Architecte Data ?

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    ร‰VOLUTION DU DATA ENGINEER                               โ”‚
โ”‚                                                                             โ”‚
โ”‚   Junior               Senior               Staff/Principal                 โ”‚
โ”‚   โ”€โ”€โ”€โ”€โ”€โ”€               โ”€โ”€โ”€โ”€โ”€โ”€               โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€                 โ”‚
โ”‚                                                                             โ”‚
โ”‚   "Comment faire"      "Quoi faire"         "Pourquoi faire"               โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ€ข Exรฉcute les        โ€ข Conรงoit les        โ€ข Dรฉfinit la vision            โ”‚
โ”‚     tรขches               pipelines          โ€ข Prend les dรฉcisions          โ”‚
โ”‚   โ€ข Suit les           โ€ข Choisit les          d'architecture               โ”‚
โ”‚     patterns             outils             โ€ข Anticipe les                 โ”‚
โ”‚   โ€ข Apprend            โ€ข Rรฉsout les           problรจmes futurs             โ”‚
โ”‚                          problรจmes          โ€ข Influence l'org              โ”‚
โ”‚                          complexes                                          โ”‚
โ”‚                                                                             โ”‚
โ”‚   Focus: Code          Focus: Systรจme       Focus: Stratรฉgie               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

1.2 Les Questions Fondamentales

Avant tout choix technique, pose-toi ces questions :

Question Pourquoi cโ€™est important
Quel problรจme rรฉsout-on ? ร‰viter le solutionnisme technologique
Quelles sont les contraintes ? Budget, รฉquipe, deadline, legacy
Quelle est lโ€™รฉchelle ? 1 GB vs 1 PB = architectures trรจs diffรฉrentes
Quelle latence est acceptable ? Batch vs Streaming
Qui va maintenir ? Complexitรฉ vs compรฉtences รฉquipe
Comment รงa va รฉvoluer ? Anticipation vs over-engineering

1.3 Le Principe de la Solution la Plus Simple

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    COMPLEXITร‰ vs VALEUR                                     โ”‚
โ”‚                                                                             โ”‚
โ”‚   Valeur                                                                    โ”‚
โ”‚   Business    โ”‚                      โ”Œโ”€โ”€โ”€โ”€ Zone Danger                     โ”‚
โ”‚       โ–ฒ       โ”‚                     โ•ฑ      (over-engineering)              โ”‚
โ”‚       โ”‚       โ”‚         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฑ                                       โ”‚
โ”‚       โ”‚       โ”‚        โ•ฑ                                                   โ”‚
โ”‚       โ”‚       โ”‚       โ•ฑ   Zone Optimale                                    โ”‚
โ”‚       โ”‚       โ”‚      โ•ฑ    (bon trade-off)                                  โ”‚
โ”‚       โ”‚       โ”‚     โ•ฑ                                                      โ”‚
โ”‚       โ”‚       โ”‚โ”€โ”€โ”€โ”€โ•ฑ                                                       โ”‚
โ”‚       โ”‚       โ”‚   โ•ฑ  Zone Simple                                           โ”‚
โ”‚       โ”‚       โ”‚  โ•ฑ   (MVP, quick wins)                                     โ”‚
โ”‚       โ”‚       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ                 โ”‚
โ”‚                              Complexitรฉ Technique                          โ”‚
โ”‚                                                                             โ”‚
โ”‚   RรˆGLE : Commence simple, complexifie seulement quand Nร‰CESSAIRE         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2. Patterns dโ€™Architecture Data

2.1 Lambda vs Kappa vs Delta Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    LAMBDA ARCHITECTURE                                      โ”‚
โ”‚                                                                             โ”‚
โ”‚                         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                               โ”‚
โ”‚                         โ”‚   Batch Layer    โ”‚                               โ”‚
โ”‚                    โ”Œโ”€โ”€โ”€โ–ถโ”‚   (Spark Batch)  โ”‚โ”€โ”€โ”€โ”                           โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”‚    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚   โ”‚  Source โ”‚โ”€โ”€โ”€โ”€โ”€โ”ค                           โ”œโ”€โ”€โ”€โ–ถโ”‚  Serving Layer  โ”‚    โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ”‚    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”‚                    โ””โ”€โ”€โ”€โ–ถโ”‚   Speed Layer    โ”‚โ”€โ”€โ”€โ”˜                           โ”‚
โ”‚                         โ”‚   (Streaming)    โ”‚                               โ”‚
โ”‚                         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                               โ”‚
โ”‚                                                                             โ”‚
โ”‚   โœ… Accurate (batch) + Fast (streaming)                                   โ”‚
โ”‚   โŒ 2 codebases ร  maintenir                                               โ”‚
โ”‚   โŒ Complexitรฉ opรฉrationnelle                                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    KAPPA ARCHITECTURE                                       โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”            โ”‚
โ”‚   โ”‚  Source โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚   Stream Layer   โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚  Serving Layer  โ”‚            โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ”‚   (Kafka + Flink)โ”‚     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜            โ”‚
โ”‚                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                     โ”‚
โ”‚                                                                             โ”‚
โ”‚   โœ… Une seule codebase                                                    โ”‚
โ”‚   โœ… Simplicitรฉ opรฉrationnelle                                             โ”‚
โ”‚   โŒ Reprocessing = rejouer tout le stream                                 โ”‚
โ”‚   โŒ Pas idรฉal pour ML training (besoin de batch)                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    DELTA ARCHITECTURE (Lakehouse)                           โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”            โ”‚
โ”‚   โ”‚  Source โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚   Unified Layer  โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚  Serving Layer  โ”‚            โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ”‚   (Delta Lake)   โ”‚     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜            โ”‚
โ”‚                   โ”‚                  โ”‚                                     โ”‚
โ”‚                   โ”‚  Batch + Stream  โ”‚                                     โ”‚
โ”‚                   โ”‚  Same code/table โ”‚                                     โ”‚
โ”‚                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                     โ”‚
โ”‚                                                                             โ”‚
โ”‚   โœ… Une seule codebase                                                    โ”‚
โ”‚   โœ… Time travel pour reprocessing                                         โ”‚
โ”‚   โœ… ACID transactions                                                     โ”‚
โ”‚   โœ… Batch et streaming sur mรชmes tables                                   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2.2 Matrice de Dรฉcision : Lambda vs Kappa vs Delta

Critรจre Lambda Kappa Delta
Complexitรฉ ops ๐Ÿ”ด Haute ๐ŸŸข Basse ๐ŸŸข Basse
Reprocessing ๐ŸŸข Facile ๐Ÿ”ด Difficile ๐ŸŸข Facile
Latence ๐ŸŸก Mixte ๐ŸŸข Temps rรฉel ๐ŸŸก Near real-time
ML Training ๐ŸŸข Bon ๐Ÿ”ด Difficile ๐ŸŸข Bon
Coรปt ๐Ÿ”ด ร‰levรฉ ๐ŸŸข Modรฉrรฉ ๐ŸŸข Modรฉrรฉ
Quand choisir Legacy, besoins spรฉcifiques Pure streaming Recommandรฉ par dรฉfaut

2.3 Batch vs Streaming vs Hybrid

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    QUAND UTILISER QUOI ?                                    โ”‚
โ”‚                                                                             โ”‚
โ”‚   BATCH                          STREAMING                  HYBRID         โ”‚
โ”‚   โ”€โ”€โ”€โ”€โ”€                          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€                  โ”€โ”€โ”€โ”€โ”€โ”€         โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ€ข Reports quotidiens           โ€ข Fraud detection          โ€ข La plupart   โ”‚
โ”‚   โ€ข ML training                  โ€ข Real-time reco             des cas      โ”‚
โ”‚   โ€ข Data warehouse refresh       โ€ข Alerting                               โ”‚
โ”‚   โ€ข Backfill historique          โ€ข IoT monitoring          Batch pour      โ”‚
โ”‚                                  โ€ข Live dashboards          historique,    โ”‚
โ”‚   Latence: heures               Latence: secondes          Streaming pour  โ”‚
โ”‚                                                              temps rรฉel    โ”‚
โ”‚                                                                             โ”‚
โ”‚   ๐Ÿ’ก RรˆGLE : Si "temps rรฉel" n'est pas un VRAI besoin business,           โ”‚
โ”‚              commence par BATCH. C'est plus simple et moins cher.          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2.4 Questions pour Choisir Batch vs Streaming

Question Si OUI โ†’ Si NON โ†’
Le business perd de lโ€™argent si latence > 1 min ? Streaming Batch
Les donnรฉes arrivent en continu 24/7 ? Streaming Batch
Lโ€™รฉquipe a de lโ€™expรฉrience streaming ? Streaming OK Batch dโ€™abord
Budget ops illimitรฉ ? Streaming OK Batch moins cher
Use case = alerting/fraud/monitoring ? Streaming Batch souvent OK

2.5 Data Lake vs Data Warehouse vs Lakehouse

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    DATA LAKE vs WAREHOUSE vs LAKEHOUSE                      โ”‚
โ”‚                                                                             โ”‚
โ”‚   DATA LAKE                DATA WAREHOUSE           LAKEHOUSE               โ”‚
โ”‚   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€                โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€           โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€               โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”          โ”‚
โ”‚   โ”‚   S3/GCS    โ”‚         โ”‚  Snowflake  โ”‚         โ”‚ Delta Lake  โ”‚          โ”‚
โ”‚   โ”‚   (files)   โ”‚         โ”‚  Redshift   โ”‚         โ”‚  Iceberg    โ”‚          โ”‚
โ”‚   โ”‚             โ”‚         โ”‚  BigQuery   โ”‚         โ”‚             โ”‚          โ”‚
โ”‚   โ”‚ Raw + Semi  โ”‚         โ”‚  Structured โ”‚         โ”‚   Unified   โ”‚          โ”‚
โ”‚   โ”‚ structured  โ”‚         โ”‚    only     โ”‚         โ”‚             โ”‚          โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜          โ”‚
โ”‚                                                                             โ”‚
โ”‚   โœ… Cheap storage        โœ… Fast queries          โœ… Best of both          โ”‚
โ”‚   โœ… Flexible             โœ… ACID                  โœ… ACID                  โ”‚
โ”‚   โœ… All data types       โœ… Governance            โœ… Open formats          โ”‚
โ”‚   โŒ No ACID              โŒ Expensive             โœ… ML + Analytics        โ”‚
โ”‚   โŒ Query perf           โŒ Vendor lock-in        โœ… Streaming             โ”‚
โ”‚   โŒ Data swamp risk      โŒ ETL required                                   โ”‚
โ”‚                                                                             โ”‚
โ”‚   ๐Ÿ“… 2010s                ๐Ÿ“… 2000s-now             ๐Ÿ“… 2020s+                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2.6 Recommandation Moderne

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    RECOMMANDATION 2024+                                     โ”‚
โ”‚                                                                             โ”‚
โ”‚   Dร‰FAUT : Lakehouse (Delta/Iceberg) + Compute sรฉparรฉ (Spark/Trino)        โ”‚
โ”‚                                                                             โ”‚
โ”‚   EXCEPTIONS :                                                              โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ€ข ร‰quipe 100% SQL, pas de ML โ†’ Cloud DW (Snowflake, BigQuery)            โ”‚
โ”‚   โ€ข Budget serrรฉ, petit volume โ†’ DuckDB + Parquet                          โ”‚
โ”‚   โ€ข Enterprise legacy โ†’ Conserver DW existant, ajouter Lake                โ”‚
โ”‚   โ€ข Real-time OLAP โ†’ ClickHouse/Druid en complรฉment                        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2.7 Patterns de Data Modeling

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    MEDALLION ARCHITECTURE                                   โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                  โ”‚
โ”‚   โ”‚   BRONZE    โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚   SILVER    โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚    GOLD     โ”‚                  โ”‚
โ”‚   โ”‚   (Raw)     โ”‚     โ”‚  (Cleaned)  โ”‚     โ”‚ (Aggregated)โ”‚                  โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                  โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ€ข Ingestion brute    โ€ข Dรฉduplication     โ€ข Business metrics              โ”‚
โ”‚   โ€ข Append-only        โ€ข Validation        โ€ข Dimensional models            โ”‚
โ”‚   โ€ข Schemaless OK      โ€ข Enrichissement    โ€ข Ready for BI                  โ”‚
โ”‚                        โ€ข Schema enforced                                    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    DIMENSIONAL MODELING (Kimball)                           โ”‚
โ”‚                                                                             โ”‚
โ”‚                        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                   โ”‚
โ”‚                        โ”‚   dim_date    โ”‚                                   โ”‚
โ”‚                        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                   โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”‚           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”               โ”‚
โ”‚   โ”‚ dim_customer  โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚  dim_product  โ”‚               โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ”‚           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜               โ”‚
โ”‚                        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”                                     โ”‚
โ”‚                        โ”‚ fact_sales  โ”‚                                     โ”‚
โ”‚                        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                     โ”‚
โ”‚                                                                             โ”‚
โ”‚   โœ… Optimisรฉ pour BI/reporting                                            โ”‚
โ”‚   โœ… Facile ร  comprendre                                                   โ”‚
โ”‚   โŒ Redondance (dรฉnormalisation)                                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    DATA VAULT                                               โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                              โ”‚
โ”‚   โ”‚   HUB   โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚  LINK   โ”‚โ—€โ”€โ”€โ”€โ”€โ”‚   HUB   โ”‚                              โ”‚
โ”‚   โ”‚(Customer)โ”‚     โ”‚ (Order) โ”‚     โ”‚(Product)โ”‚                              โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜                              โ”‚
โ”‚        โ”‚                               โ”‚                                    โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”                     โ”Œโ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”                              โ”‚
โ”‚   โ”‚SATELLITEโ”‚                     โ”‚SATELLITEโ”‚                              โ”‚
โ”‚   โ”‚(attrs)  โ”‚                     โ”‚(attrs)  โ”‚                              โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                              โ”‚
โ”‚                                                                             โ”‚
โ”‚   โœ… Historisation complรจte                                                โ”‚
โ”‚   โœ… Flexibilitรฉ (ajout sources facile)                                    โ”‚
โ”‚   โŒ Complexe ร  implรฉmenter                                                โ”‚
โ”‚   โŒ Queries plus complexes                                                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2.8 Quand Utiliser Quel Modeling ?

Pattern Quand lโ€™utiliser Quand รฉviter
Medallion Lakehouse, ETL moderne, ML Petit projet sans layers
Dimensional (Kimball) BI/Reporting, DW classique Data science, ML features
Data Vault Enterprise, audit strict, multi-sources Startup, MVP, รฉquipe petite
One Big Table (OBT) Analytics simple, ML features Beaucoup de dimensions

3. Framework de Dรฉcision

3.1 Le Process de Dรฉcision

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    FRAMEWORK DE Dร‰CISION ARCHITECTURE                       โ”‚
โ”‚                                                                             โ”‚
โ”‚   1. DEFINE          2. DISCOVER         3. DECIDE          4. DOCUMENT    โ”‚
โ”‚   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€           โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€      โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚   โ”‚ Quel     โ”‚      โ”‚ Quelles  โ”‚       โ”‚ ร‰valuer  โ”‚       โ”‚ ADR      โ”‚    โ”‚
โ”‚   โ”‚ problรจme โ”‚โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚ options  โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚ trade-   โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚ (รฉcrit)  โ”‚    โ”‚
โ”‚   โ”‚ ?        โ”‚      โ”‚ ?        โ”‚       โ”‚ offs     โ”‚       โ”‚          โ”‚    โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ€ข Requirements     โ€ข 3-5 options      โ€ข Matrice          โ€ข Contexte      โ”‚
โ”‚   โ€ข Constraints      โ€ข Recherche        โ€ข PoC si doute     โ€ข Dรฉcision      โ”‚
โ”‚   โ€ข Success criteria โ€ข Benchmarks       โ€ข Consensus        โ€ข Consรฉquences  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

3.2 Template de Requirements

Voir le code
# Template de Requirements pour une dรฉcision d'architecture

requirements_template = """
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# REQUIREMENTS DOCUMENT
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

## 1. Contexte
- Projet : [Nom du projet]
- Date : [Date]
- Auteur : [Ton nom]
- Stakeholders : [Qui est impactรฉ]

## 2. Problรจme ร  rรฉsoudre
[Description claire du problรจme en 2-3 phrases]

## 3. Functional Requirements (FR)
- FR1 : [Ce que le systรจme DOIT faire]
- FR2 : [Ce que le systรจme DOIT faire]
- FR3 : [...]

## 4. Non-Functional Requirements (NFR)

### Performance
- Latence max : [X secondes/minutes]
- Throughput : [X events/sec ou X GB/jour]
- Concurrent users : [X]

### Scalabilitรฉ
- Volume actuel : [X GB]
- Volume dans 1 an : [X GB]
- Volume dans 3 ans : [X GB]

### Disponibilitรฉ
- SLA cible : [99.9% ?]
- Downtime acceptable : [X heures/mois]
- RTO (Recovery Time) : [X heures]
- RPO (Data Loss) : [X minutes]

### Sรฉcuritรฉ
- Donnรฉes sensibles : [Oui/Non]
- Compliance : [GDPR, HIPAA, SOC2...]
- Encryption : [At rest, in transit]

## 5. Contraintes
- Budget : [X โ‚ฌ/mois]
- Timeline : [Date de livraison]
- ร‰quipe : [X personnes, compรฉtences]
- Legacy : [Systรจmes existants ร  intรฉgrer]
- Vendor : [Restrictions cloud/vendor]

## 6. Critรจres de succรจs
- [ ] [Critรจre mesurable 1]
- [ ] [Critรจre mesurable 2]
- [ ] [Critรจre mesurable 3]
"""

print(requirements_template)

3.3 Matrice de Dรฉcision

Voir le code
import pandas as pd

# Exemple : Choisir un orchestrateur

criteria = {
    'Critรจre': [
        'Facilitรฉ d\'apprentissage',
        'Scalabilitรฉ',
        'Communautรฉ/Support',
        'Coรปt opรฉrationnel',
        'Intรฉgration cloud',
        'Fonctionnalitรฉs avancรฉes'
    ],
    'Poids': [3, 4, 3, 4, 3, 2],  # Importance 1-5
    'Airflow': [3, 5, 5, 3, 4, 5],  # Score 1-5
    'Prefect': [4, 4, 3, 4, 3, 4],
    'Dagster': [3, 4, 3, 4, 3, 5],
    'Step Functions': [4, 5, 4, 5, 5, 3]
}

df = pd.DataFrame(criteria)

# Calcul des scores pondรฉrรฉs
for option in ['Airflow', 'Prefect', 'Dagster', 'Step Functions']:
    df[f'{option}_weighted'] = df['Poids'] * df[option]

# Totaux
totals = {
    'Option': ['Airflow', 'Prefect', 'Dagster', 'Step Functions'],
    'Score Total': [
        df['Airflow_weighted'].sum(),
        df['Prefect_weighted'].sum(),
        df['Dagster_weighted'].sum(),
        df['Step Functions_weighted'].sum()
    ]
}

print("๐Ÿ“Š MATRICE DE Dร‰CISION : Choix d'Orchestrateur")
print("="*60)
print(df[['Critรจre', 'Poids', 'Airflow', 'Prefect', 'Dagster', 'Step Functions']].to_string(index=False))
print("\n๐Ÿ“ˆ SCORES TOTAUX (pondรฉrรฉs) :")
print("-"*40)
for opt, score in zip(totals['Option'], totals['Score Total']):
    print(f"  {opt:20} : {score}")
print("\nโœ… Recommandation : " + totals['Option'][totals['Score Total'].index(max(totals['Score Total']))])

4. Architecture Decision Records (ADR)

4.1 Pourquoi Documenter les Dรฉcisions ?

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    PROBLรˆME CLASSIQUE                                       โ”‚
โ”‚                                                                             โ”‚
โ”‚   Nouveau dรฉveloppeur : "Pourquoi on utilise Kafka et pas RabbitMQ ?"      โ”‚
โ”‚                                                                             โ”‚
โ”‚   ร‰quipe : "Euh... c'รฉtait lร  quand je suis arrivรฉ."                       โ”‚
โ”‚            "Je crois que c'est Jean qui a dรฉcidรฉ, mais il est parti."      โ”‚
โ”‚            "On a toujours fait comme รงa."                                  โ”‚
โ”‚                                                                             โ”‚
โ”‚   Rร‰SULTAT :                                                                โ”‚
โ”‚   โ€ข Dรฉcisions remises en question sans contexte                            โ”‚
โ”‚   โ€ข Mรชmes erreurs rรฉpรฉtรฉes                                                 โ”‚
โ”‚   โ€ข Perte de temps ร  rediscuter                                            โ”‚
โ”‚                                                                             โ”‚
โ”‚   SOLUTION : Architecture Decision Records (ADR)                            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

4.2 Format ADR

Voir le code
# Template ADR (Architecture Decision Record)

adr_template = """
# ADR-001 : [Titre de la dรฉcision]

## Status
[Proposed | Accepted | Deprecated | Superseded by ADR-XXX]

## Date
2024-XX-XX

## Context
[Quel est le problรจme ? Pourquoi cette dรฉcision est nรฉcessaire ?]

## Decision Drivers
- [Driver 1 : ex. "Besoin de traiter 10K events/sec"]
- [Driver 2 : ex. "ร‰quipe familiรจre avec Python"]
- [Driver 3 : ex. "Budget limitรฉ ร  Xโ‚ฌ/mois"]

## Considered Options
1. [Option A]
2. [Option B]
3. [Option C]

## Decision
[Quelle option a รฉtรฉ choisie et POURQUOI]

## Consequences

### Positives
- [Consรฉquence positive 1]
- [Consรฉquence positive 2]

### Negatives
- [Consรฉquence nรฉgative 1]
- [Trade-off acceptรฉ]

### Risks
- [Risque identifiรฉ et mitigation]

## Related
- [Lien vers ADR connexes]
- [Lien vers documentation]
"""

print(adr_template)
Voir le code
# Exemple concret d'ADR

adr_example = """
# ADR-003 : Choix de Delta Lake comme Table Format

## Status
Accepted

## Date
2024-03-15

## Context
Notre Data Lake sur S3 souffre de plusieurs problรจmes :
- Pas de transactions ACID (corruptions lors d'รฉchecs de jobs)
- Pas de schema enforcement (colonnes manquantes non dรฉtectรฉes)
- Updates/deletes impossibles (GDPR compliance)
- Pas de time travel pour debug

Nous devons choisir un table format pour rรฉsoudre ces problรจmes.

## Decision Drivers
- Besoin d'ACID pour รฉviter les corruptions
- Support GDPR (delete user data)
- ร‰quipe utilise dรฉjร  Spark 3.x
- Pas de budget pour Databricks
- Prรฉfรฉrence pour l'open source

## Considered Options
1. **Delta Lake (OSS)** - Format Databricks, maintenant open source
2. **Apache Iceberg** - Format Netflix, trรจs actif
3. **Apache Hudi** - Format Uber, orientรฉ CDC
4. **Rester sur Parquet brut** - Status quo

## Decision
Nous choisissons **Delta Lake (Open Source)** car :

1. Meilleure intรฉgration Spark (notre stack principale)
2. Documentation extensive et communautรฉ active
3. Migration facile depuis Parquet (CONVERT TO DELTA)
4. Fonctionnalitรฉs matures (MERGE, time travel, schema evolution)
5. Pas de dรฉpendance ร  Databricks (version OSS suffit)

Iceberg รฉtait un close second, mais l'รฉcosystรจme Spark+Delta
est plus mature en 2024.

## Consequences

### Positives
- ACID transactions โ†’ plus de corruptions
- Time travel โ†’ debug et audit facilitรฉs
- Schema enforcement โ†’ erreurs dรฉtectรฉes tรดt
- MERGE โ†’ GDPR compliance possible

### Negatives
- Lรฉgรจre courbe d'apprentissage รฉquipe
- Vacuum ร  scheduler rรฉguliรจrement
- Pas de support Trino natif (workaround existe)

### Risks
- Databricks pourrait rรฉduire investissement OSS
  โ†’ Mitigation : Iceberg comme plan B, migration possible

## Related
- ADR-001 : Choix de S3 comme storage
- ADR-002 : Choix de Spark comme compute engine
"""

print(adr_example)

4.3 Organisation des ADRs

docs/
โ””โ”€โ”€ architecture/
    โ””โ”€โ”€ decisions/
        โ”œโ”€โ”€ README.md           # Index des ADRs
        โ”œโ”€โ”€ 0001-use-s3-storage.md
        โ”œโ”€โ”€ 0002-choose-spark.md
        โ”œโ”€โ”€ 0003-delta-lake.md
        โ”œโ”€โ”€ 0004-airflow-orchestration.md
        โ””โ”€โ”€ template.md         # Template pour nouvelles ADRs

4.4 Bonnes Pratiques ADR

โœ… DO โŒ DONโ€™T
ร‰crire au moment de la dรฉcision ร‰crire des mois aprรจs
Inclure le contexte complet Supposer que le lecteur sait
Documenter les options rejetรฉes Ne documenter que le choix final
Lister les trade-offs acceptรฉs Prรฉtendre que cโ€™est parfait
Mettre ร  jour le status Laisser des ADRs obsolรจtes actifs

5. Sizing & Capacity Planning

5.1 Estimer le Storage

Voir le code
# Calculator de Storage

def estimate_storage(
    events_per_day: int,
    avg_event_size_bytes: int,
    retention_days: int,
    compression_ratio: float = 0.1,  # Parquet/Delta = ~10x compression
    replication_factor: int = 1,
    growth_rate_monthly: float = 0.1  # 10% growth/month
) -> dict:
    """
    Estime le storage nรฉcessaire pour un Data Lake.
    """
    # Calcul de base
    raw_daily_gb = (events_per_day * avg_event_size_bytes) / (1024**3)
    compressed_daily_gb = raw_daily_gb * compression_ratio
    
    # Avec retention
    total_gb = compressed_daily_gb * retention_days * replication_factor
    
    # Projection 1 an avec croissance
    monthly_growth = 1 + growth_rate_monthly
    total_1year_gb = total_gb * (monthly_growth ** 12)
    
    return {
        "daily_raw_gb": round(raw_daily_gb, 2),
        "daily_compressed_gb": round(compressed_daily_gb, 2),
        "total_current_gb": round(total_gb, 2),
        "total_1year_gb": round(total_1year_gb, 2),
        "monthly_cost_s3_standard": round(total_gb * 0.023, 2),  # $0.023/GB
        "monthly_cost_1year": round(total_1year_gb * 0.023, 2),
    }

# Exemple : E-commerce
result = estimate_storage(
    events_per_day=10_000_000,      # 10M events/jour
    avg_event_size_bytes=500,        # 500 bytes/event (JSON)
    retention_days=365,              # 1 an de rรฉtention
    compression_ratio=0.1,           # Parquet compresse ~10x
    growth_rate_monthly=0.15         # 15% croissance/mois
)

print("๐Ÿ“Š ESTIMATION STORAGE")
print("="*50)
print(f"  Daily raw data      : {result['daily_raw_gb']} GB")
print(f"  Daily compressed    : {result['daily_compressed_gb']} GB")
print(f"  Total current       : {result['total_current_gb']} GB ({result['total_current_gb']/1024:.1f} TB)")
print(f"  Total in 1 year     : {result['total_1year_gb']} GB ({result['total_1year_gb']/1024:.1f} TB)")
print(f"\n๐Ÿ’ฐ COร›T S3 (Standard)")
print(f"  Current monthly     : ${result['monthly_cost_s3_standard']}")
print(f"  In 1 year monthly   : ${result['monthly_cost_1year']}")

5.2 Estimer le Compute

Voir le code
# Calculator de Compute Spark

def estimate_spark_cluster(
    data_to_process_gb: float,
    processing_time_target_hours: float,
    complexity_factor: float = 1.0,  # 1.0 = simple ETL, 2.0 = joins complexes, 3.0 = ML
    memory_per_gb_data: float = 2.0,  # 2GB RAM pour 1GB data (rule of thumb)
) -> dict:
    """
    Estime la taille d'un cluster Spark.
    """
    # Mรฉmoire totale nรฉcessaire
    total_memory_gb = data_to_process_gb * memory_per_gb_data * complexity_factor
    
    # Throughput cible
    throughput_gb_per_hour = data_to_process_gb / processing_time_target_hours
    
    # Sizing nodes (ex: r5.2xlarge = 64GB RAM, 8 cores)
    node_memory_gb = 64
    node_cores = 8
    num_nodes = max(1, int(total_memory_gb / (node_memory_gb * 0.75)))  # 75% usable
    
    # Coรปt (r5.2xlarge on-demand = ~$0.50/hour)
    hourly_cost = num_nodes * 0.50
    job_cost = hourly_cost * processing_time_target_hours
    
    return {
        "total_memory_needed_gb": round(total_memory_gb, 0),
        "throughput_gb_per_hour": round(throughput_gb_per_hour, 1),
        "recommended_nodes": num_nodes,
        "total_cores": num_nodes * node_cores,
        "total_memory_gb": num_nodes * node_memory_gb,
        "hourly_cost": round(hourly_cost, 2),
        "job_cost": round(job_cost, 2),
    }

# Exemple : Job ETL quotidien
result = estimate_spark_cluster(
    data_to_process_gb=500,           # 500 GB ร  traiter
    processing_time_target_hours=2,    # En 2 heures max
    complexity_factor=1.5,             # ETL avec quelques joins
)

print("๐Ÿ–ฅ๏ธ ESTIMATION CLUSTER SPARK")
print("="*50)
print(f"  Memory needed       : {result['total_memory_needed_gb']} GB")
print(f"  Throughput target   : {result['throughput_gb_per_hour']} GB/hour")
print(f"\n๐Ÿ“Š CLUSTER SIZING (r5.2xlarge)")
print(f"  Nodes recommended   : {result['recommended_nodes']}")
print(f"  Total cores         : {result['total_cores']}")
print(f"  Total memory        : {result['total_memory_gb']} GB")
print(f"\n๐Ÿ’ฐ COร›T")
print(f"  Hourly              : ${result['hourly_cost']}")
print(f"  Per job             : ${result['job_cost']}")
print(f"  Monthly (1 job/day) : ${result['job_cost'] * 30:.0f}")

5.3 Rรจgles de Capacity Planning

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    RรˆGLES DE SIZING                                         โ”‚
โ”‚                                                                             โ”‚
โ”‚   STORAGE                                                                   โ”‚
โ”‚   โ”€โ”€โ”€โ”€โ”€โ”€โ”€                                                                   โ”‚
โ”‚   โ€ข Prรฉvoir 2-3x le volume actuel pour la croissance                       โ”‚
โ”‚   โ€ข Parquet/Delta = 5-10x compression vs JSON/CSV                          โ”‚
โ”‚   โ€ข Ajouter 20% pour les metadata, logs, temp files                        โ”‚
โ”‚                                                                             โ”‚
โ”‚   SPARK MEMORY                                                              โ”‚
โ”‚   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€                                                              โ”‚
โ”‚   โ€ข 2-4 GB RAM par 1 GB de donnรฉes ร  traiter                               โ”‚
โ”‚   โ€ข Joins/aggregations complexes = x2 ou x3                                โ”‚
โ”‚   โ€ข Broadcast joins si une table < 10 MB                                   โ”‚
โ”‚                                                                             โ”‚
โ”‚   SPARK PARALLELISM                                                         โ”‚
โ”‚   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€                                                         โ”‚
โ”‚   โ€ข 2-4 partitions par core                                                โ”‚
โ”‚   โ€ข Partition size idรฉale = 128 MB - 256 MB                                โ”‚
โ”‚   โ€ข Trop de partitions = overhead scheduling                               โ”‚
โ”‚                                                                             โ”‚
โ”‚   KAFKA                                                                     โ”‚
โ”‚   โ”€โ”€โ”€โ”€โ”€                                                                     โ”‚
โ”‚   โ€ข Partitions = throughput / 10 MB/s (par partition)                      โ”‚
โ”‚   โ€ข Replication factor = 3 (production)                                    โ”‚
โ”‚   โ€ข Retention = jours nรฉcessaires pour replay                              โ”‚
โ”‚                                                                             โ”‚
โ”‚   CLICKHOUSE                                                                โ”‚
โ”‚   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€                                                                โ”‚
โ”‚   โ€ข 1 core = ~100-500 MB/s scan rate                                       โ”‚
โ”‚   โ€ข RAM = 10-20% du dataset frรฉquemment queryรฉ                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

6. Anti-Patterns ร  ร‰viter

6.1 Resume-Driven Development

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    โŒ RESUME-DRIVEN DEVELOPMENT                             โ”‚
โ”‚                                                                             โ”‚
โ”‚   "On devrait utiliser Kubernetes + Kafka + Flink + Delta Lake +           โ”‚
โ”‚    GraphQL + Terraform + ArgoCD pour notre dashboard interne               โ”‚
โ”‚    qui a 10 utilisateurs."                                                 โ”‚
โ”‚                                                                             โ”‚
โ”‚   SYMPTร”MES :                                                               โ”‚
โ”‚   โ€ข Choisir une techno parce que "รงa fait bien sur le CV"                  โ”‚
โ”‚   โ€ข Over-engineering pour des use cases simples                            โ”‚
โ”‚   โ€ข Stack incomprรฉhensible par l'รฉquipe                                    โ”‚
โ”‚   โ€ข Coรปts d'infrastructure disproportionnรฉs                                โ”‚
โ”‚                                                                             โ”‚
โ”‚   SOLUTION :                                                                โ”‚
โ”‚   โ€ข "Boring technology" d'abord                                            โ”‚
โ”‚   โ€ข Justifier CHAQUE ajout de complexitรฉ                                   โ”‚
โ”‚   โ€ข Demander : "Est-ce que PostgreSQL suffirait ?"                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

6.2 Cargo Cult Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    โŒ CARGO CULT ARCHITECTURE                               โ”‚
โ”‚                                                                             โ”‚
โ”‚   "Netflix utilise X, donc on devrait utiliser X."                         โ”‚
โ”‚                                                                             โ”‚
โ”‚   SYMPTร”MES :                                                               โ”‚
โ”‚   โ€ข Copier l'architecture des FAANG sans comprendre le contexte            โ”‚
โ”‚   โ€ข Ignorer les diffรฉrences d'รฉchelle (10 users vs 100M users)             โ”‚
โ”‚   โ€ข Ignorer les diffรฉrences de budget et d'รฉquipe                          โ”‚
โ”‚                                                                             โ”‚
โ”‚   Rร‰ALITร‰ :                                                                 โ”‚
โ”‚   โ€ข Netflix a des milliers d'ingรฉnieurs                                    โ”‚
โ”‚   โ€ข Leur รฉchelle justifie la complexitรฉ                                    โ”‚
โ”‚   โ€ข Ce qui marche pour eux ne marchera pas pour toi                        โ”‚
โ”‚                                                                             โ”‚
โ”‚   SOLUTION :                                                                โ”‚
โ”‚   โ€ข Comprendre POURQUOI ils ont fait ce choix                              โ”‚
โ”‚   โ€ข ร‰valuer si tes contraintes sont similaires                             โ”‚
โ”‚   โ€ข Adapter, ne pas copier aveuglรฉment                                     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

6.3 Autres Anti-Patterns

Anti-Pattern Description Solution
Premature Optimization Optimiser avant de mesurer Mesurer dโ€™abord, optimiser ensuite
Golden Hammer โ€œSpark pour tout !โ€ Choisir lโ€™outil adaptรฉ au problรจme
Not Invented Here Refuser les solutions existantes ร‰valuer buy vs build objectivement
Analysis Paralysis Trop dโ€™analyse, pas dโ€™action Time-box les dรฉcisions, PoC rapides
Shiny Object Syndrome Adopter chaque nouvelle techno Attendre la maturitรฉ, รฉvaluer les risques
Distributed Monolith Microservices trop couplรฉs Si tout doit รชtre dรฉployรฉ ensemble = monolith

7. Case Studies

7.1 Startup vs Enterprise

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    STARTUP (< 50 personnes, < $1M ARR)                      โ”‚
โ”‚                                                                             โ”‚
โ”‚   CONTRAINTES :                          ARCHITECTURE RECOMMANDร‰E :         โ”‚
โ”‚   โ€ข Budget limitรฉ                        โ€ข Managed services (BigQuery,      โ”‚
โ”‚   โ€ข ร‰quipe petite (1-3 DE)                 Snowflake, Fivetran)             โ”‚
โ”‚   โ€ข Time-to-market critique              โ€ข Pas de Kubernetes                โ”‚
โ”‚   โ€ข Besoins qui changent vite            โ€ข PostgreSQL > Data Lake           โ”‚
โ”‚                                          โ€ข dbt Cloud > dbt Core             โ”‚
โ”‚   RรˆGLE : Minimiser l'ops,               โ€ข ร‰viter le self-hosted            โ”‚
โ”‚           maximiser la vรฉlocitรฉ                                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    SCALE-UP (50-500 personnes, $10M+ ARR)                   โ”‚
โ”‚                                                                             โ”‚
โ”‚   CONTRAINTES :                          ARCHITECTURE RECOMMANDร‰E :         โ”‚
โ”‚   โ€ข Volume croissant rapidement          โ€ข Lakehouse (Delta/Iceberg)        โ”‚
โ”‚   โ€ข ร‰quipe data 5-20 personnes           โ€ข Spark + Kubernetes               โ”‚
โ”‚   โ€ข Besoin de gouvernance                โ€ข Airflow managed ou K8s           โ”‚
โ”‚   โ€ข Multi-รฉquipes consomment data        โ€ข Data Catalog (DataHub)           โ”‚
โ”‚                                          โ€ข Data Contracts                   โ”‚
โ”‚   RรˆGLE : Investir dans la plateforme,                                      โ”‚
โ”‚           mais rester pragmatique                                           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    ENTERPRISE (500+ personnes)                              โ”‚
โ”‚                                                                             โ”‚
โ”‚   CONTRAINTES :                          ARCHITECTURE RECOMMANDร‰E :         โ”‚
โ”‚   โ€ข Legacy systems ร  intรฉgrer            โ€ข Data Mesh                        โ”‚
โ”‚   โ€ข Compliance stricte (GDPR, SOX)       โ€ข Platform team dรฉdiรฉ              โ”‚
โ”‚   โ€ข ร‰quipes data 50+ personnes           โ€ข Self-serve analytics             โ”‚
โ”‚   โ€ข Multi-cloud possible                 โ€ข Strong governance                โ”‚
โ”‚   โ€ข Budgets importants                   โ€ข Lineage & cataloging             โ”‚
โ”‚                                          โ€ข Hybrid cloud                     โ”‚
โ”‚   RรˆGLE : Gouvernance + autonomie                                           โ”‚
โ”‚           des domaines                                                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

7.2 Case Study : E-Commerce

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    CASE STUDY : E-COMMERCE PLATFORM                         โ”‚
โ”‚                                                                             โ”‚
โ”‚   CONTEXTE :                                                                โ”‚
โ”‚   โ€ข 1M commandes/jour                                                       โ”‚
โ”‚   โ€ข 50M products                                                            โ”‚
โ”‚   โ€ข Besoin : Real-time inventory, recommendations, fraud detection         โ”‚
โ”‚                                                                             โ”‚
โ”‚   ARCHITECTURE :                                                            โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                      โ”‚
โ”‚   โ”‚   Sources   โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚  Kafka  โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚   Flink     โ”‚โ”€โ”€โ”ฌโ”€โ”€โ–ถ Redis (reco)  โ”‚
โ”‚   โ”‚ (orders,    โ”‚     โ”‚         โ”‚     โ”‚ (streaming) โ”‚  โ”‚                   โ”‚
โ”‚   โ”‚  clicks,    โ”‚     โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ–ถ Alerts (fraud)โ”‚
โ”‚   โ”‚  inventory) โ”‚          โ”‚                                               โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜          โ”‚          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚                            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚   Spark     โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚ Delta Lake  โ”‚ โ”‚
โ”‚                                       โ”‚   (batch)   โ”‚     โ”‚ (Lakehouse) โ”‚ โ”‚
โ”‚                                       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚                                                                  โ”‚        โ”‚
โ”‚                                                           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚                                                           โ”‚  ClickHouse โ”‚ โ”‚
โ”‚                                                           โ”‚ (dashboards)โ”‚ โ”‚
โ”‚                                                           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚                                                                            โ”‚
โ”‚   Dร‰CISIONS CLร‰S :                                                         โ”‚
โ”‚   โ€ข Kafka : source of truth pour events                                   โ”‚
โ”‚   โ€ข Flink : real-time pour fraud (< 1s latency)                           โ”‚
โ”‚   โ€ข Spark : batch pour ML training, heavy transformations                 โ”‚
โ”‚   โ€ข ClickHouse : OLAP pour dashboards (vs query Delta direct)             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

7.3 Case Study : FinTech

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    CASE STUDY : FINTECH (Trading Platform)                  โ”‚
โ”‚                                                                             โ”‚
โ”‚   CONTEXTE :                                                                โ”‚
โ”‚   โ€ข Compliance stricte (audit, GDPR)                                        โ”‚
โ”‚   โ€ข Low latency critique (< 100ms)                                          โ”‚
โ”‚   โ€ข Data retention 7 ans                                                    โ”‚
โ”‚   โ€ข Exactitude 100% requise                                                 โ”‚
โ”‚                                                                             โ”‚
โ”‚   Dร‰CISIONS SPร‰CIFIQUES :                                                   โ”‚
โ”‚                                                                             โ”‚
โ”‚   1. IMMUTABILITร‰                                                           โ”‚
โ”‚      โ€ข Append-only tables (jamais update/delete)                           โ”‚
โ”‚      โ€ข Event sourcing pattern                                               โ”‚
โ”‚      โ€ข Full audit trail                                                     โ”‚
โ”‚                                                                             โ”‚
โ”‚   2. EXACTITUDE                                                             โ”‚
โ”‚      โ€ข Decimal types (jamais float pour l'argent !)                        โ”‚
โ”‚      โ€ข Idempotency sur tous les pipelines                                  โ”‚
โ”‚      โ€ข Reconciliation batch quotidienne                                     โ”‚
โ”‚                                                                             โ”‚
โ”‚   3. RETENTION                                                              โ”‚
โ”‚      โ€ข Hot storage : 30 jours (SSD)                                        โ”‚
โ”‚      โ€ข Warm storage : 1 an (HDD)                                           โ”‚
โ”‚      โ€ข Cold storage : 7 ans (S3 Glacier)                                   โ”‚
โ”‚      โ€ข Lifecycle policies automatisรฉes                                      โ”‚
โ”‚                                                                             โ”‚
โ”‚   4. COMPLIANCE                                                             โ”‚
โ”‚      โ€ข Data Catalog obligatoire                                            โ”‚
โ”‚      โ€ข PII tagging automatique                                              โ”‚
โ”‚      โ€ข Access logs + alerts                                                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

8. Checklist Architecture Review

Utilise cette checklist pour valider une architecture avant de lโ€™implรฉmenter :

Voir le code
# Checklist Architecture Review

checklist = """
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
# ARCHITECTURE REVIEW CHECKLIST
# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

## 1. PROBLEM DEFINITION
- [ ] Le problรจme business est clairement dรฉfini
- [ ] Les requirements sont documentรฉs
- [ ] Les success criteria sont mesurables
- [ ] Les contraintes sont identifiรฉes (budget, temps, รฉquipe)

## 2. SOLUTION FIT
- [ ] La solution rรฉsout le problรจme (pas plus, pas moins)
- [ ] Les alternatives ont รฉtรฉ considรฉrรฉes
- [ ] Une solution plus simple a รฉtรฉ รฉvaluรฉe
- [ ] L'ADR est rรฉdigรฉ

## 3. SCALABILITร‰
- [ ] Volume actuel supportรฉ
- [ ] Croissance 1 an anticipรฉe
- [ ] Croissance 3 ans anticipรฉe
- [ ] Bottlenecks identifiรฉs et plan de mitigation

## 4. RELIABILITY
- [ ] SLA dรฉfini et rรฉaliste
- [ ] Single points of failure identifiรฉs
- [ ] Disaster recovery plan
- [ ] Monitoring et alerting prรฉvu

## 5. OPร‰RABILITร‰
- [ ] L'รฉquipe a les compรฉtences nรฉcessaires
- [ ] Documentation prรฉvue
- [ ] Runbooks pour incidents
- [ ] On-call rotation dรฉfinie

## 6. COร›TS
- [ ] Coรปts estimรฉs (storage, compute, licenses)
- [ ] Budget approuvรฉ
- [ ] Optimisations identifiรฉes (spot instances, reserved, etc.)
- [ ] Alertes coรปts configurรฉes

## 7. Sร‰CURITร‰
- [ ] Donnรฉes sensibles identifiรฉes
- [ ] Encryption at rest et in transit
- [ ] Access control (RBAC)
- [ ] Audit logging

## 8. ร‰VOLUTIVITร‰
- [ ] Architecture modulaire
- [ ] Pas de vendor lock-in critique
- [ ] Migration possible si besoin
- [ ] Backward compatibility considรฉrรฉe

## VALIDATION FINALE
- [ ] Review par un pair
- [ ] Stakeholders informรฉs
- [ ] Go/No-Go decision
"""

print(checklist)

9. Exercices Pratiques

Exercice 1 : Analyse de Requirements

Une startup de livraison de repas te demande de concevoir leur data platform : - 50K commandes/jour, croissance 20%/mois - Besoin de dashboards temps rรฉel pour les opรฉrations - ร‰quipe : 2 data engineers (expรฉrience Python/SQL) - Budget : $5K/mois max - Timeline : 2 mois pour le MVP

Questions : 1. Quels sont les requirements fonctionnels et non-fonctionnels ? 2. Quelle architecture recommandes-tu ? Pourquoi ? 3. Quels outils spรฉcifiques ? 4. Quels sont les risques et mitigations ?


Exercice 2 : ADR Writing

Rรฉdige un ADR complet pour le choix suivant : > โ€œUtiliser Airflow plutรดt que Prefect pour lโ€™orchestrationโ€

Inclus : context, options considรฉrรฉes, dรฉcision, consรฉquences.


Exercice 3 : Capacity Planning

Une plateforme IoT gรฉnรจre : - 10,000 devices - Chaque device envoie 1 event/seconde - Chaque event = 200 bytes - Retention : 90 jours

Calcule : 1. Volume quotidien (raw et compressรฉ) 2. Volume total avec retention 3. Coรปt S3 mensuel estimรฉ 4. Sizing Kafka (partitions recommandรฉes)


Exercice 4 : Anti-Pattern Detection

Analyse cette proposition dโ€™architecture et identifie les anti-patterns :

โ€œPour notre app interne avec 50 utilisateurs, je propose : - Kubernetes cluster avec 10 nodes - Kafka avec 100 partitions - Flink pour le streaming - Cassandra pour le stockage - Elasticsearch pour le search - Custom ML pipeline from scratchโ€


Exercice 5 : Case Study Analysis

Compare les architectures data de : 1. Uber (https://eng.uber.com/) 2. Airbnb (https://medium.com/airbnb-engineering) 3. Spotify (https://engineering.atspotify.com/)

Pour chaque : - Quels sont leurs principaux dรฉfis data ? - Quelles solutions ont-ils adoptรฉes ? - Quโ€™est-ce qui est applicable ร  une entreprise plus petite ?


๐Ÿ“š Ressources

Articles & Blogs

ADR Resources

Architecture Patterns


โžก๏ธ Prochaine รฉtape

๐Ÿ‘‰ Module suivant : 35_leadership_tradeoffs โ€” Leadership & Trade-offs in Data Engineering


๐ŸŽ‰ Fรฉlicitations ! Tu maรฎtrises maintenant les patterns dโ€™architecture et la prise de dรฉcision.

Retour au sommet