๐ฅ Niveau 3 : Avancรฉ
๐๏ธ 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
pythonVoir 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
pythonVoir 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
pythonVoir 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)pythonVoir 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
pythonVoir 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
pythonVoir 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 :
pythonVoir 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 :
- Quels sont les requirements fonctionnels et non-fonctionnels ?
- Quelle architecture recommandes-tu ? Pourquoi ?
- Quels outils spรฉcifiques ?
- 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 :
- Volume quotidien (raw et compressรฉ)
- Volume total avec retention
- Coรปt S3 mensuel estimรฉ
- 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 :
- Uber (https://eng.uber.com/)
- Airbnb (https://medium.com/airbnb-engineering)
- 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
- Designing Data-Intensive Applications โ Martin Kleppmann (THE book)
- Architecture of Open Source Applications
- High Scalability Blog
- Netflix Tech Blog
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.