praca_magisterska/pytania/odpowiedzi/16-wzorce-architektoniczne.md

235 lines
9.4 KiB
Markdown

# Pytanie 16: Wzorce architektoniczne
## Pytanie
**"Czemu służą wzorce architektoniczne? Jak powstają? Jak są katalogowane? Omówić przykładowe wzorce architektoniczne."**
Przedmiot: AIS (Architektura i Integracja Systemów)
---
## 📚 Odpowiedź główna
### 1. Cel wzorców architektonicznych
| Cel | Opis |
|-----|------|
| **Reużywalność** | Sprawdzone rozwiązania typowych problemów |
| **Komunikacja** | Wspólne słownictwo ("używamy MVC") |
| **Dokumentacja** | Zapis wiedzy architektonicznej |
| **Jakość** | Adresowanie atrybutów jakościowych |
| **Edukacja** | Nauka z doświadczeń innych |
---
### 2. Jak powstają wzorce
```
┌─────────────────────────────────────────────────────────────────┐
│ 1. PROBLEM pojawia się wielokrotnie │
│ ↓ │
│ 2. Różni architekci znajdują PODOBNE ROZWIĄZANIA │
│ ↓ │
│ 3. UOGÓLNIENIE - wyodrębnienie wspólnych elementów │
│ ↓ │
│ 4. DOKUMENTACJA w formie wzorca │
│ ↓ │
│ 5. WALIDACJA przez społeczność (peer review) │
│ ↓ │
│ 6. KATALOGOWANIE w książkach/repozytoriach │
└─────────────────────────────────────────────────────────────────┘
```
**Format opisu wzorca:**
- **Nazwa** - identyfikator
- **Kontekst** - kiedy stosować
- **Problem** - co rozwiązuje
- **Rozwiązanie** - struktura i zachowanie
- **Konsekwencje** - trade-offs
- **Znane zastosowania** - przykłady
---
### 3. Katalogowanie wzorców
| Katalog | Zakres | Przykłady |
|---------|--------|-----------|
| **POSA** (Pattern-Oriented Software Architecture) | Architektura | Layers, Pipes&Filters |
| **GoF** (Gang of Four) | Projektowe | Factory, Observer |
| **EIP** (Enterprise Integration Patterns) | Integracja | Message Router, Aggregator |
| **PoEAA** (Fowler) | Enterprise | Repository, Unit of Work |
| **Cloud Patterns** | Chmura | Circuit Breaker, Sidecar |
---
### 4. Przykładowe wzorce architektoniczne
#### Layered Architecture (Warstwy)
```
┌─────────────────────────────────────────┐
│ Presentation Layer │ UI, Controllers
├─────────────────────────────────────────┤
│ Business Logic Layer │ Services, Domain
├─────────────────────────────────────────┤
│ Data Access Layer │ Repositories, ORM
├─────────────────────────────────────────┤
│ Database │ SQL, NoSQL
└─────────────────────────────────────────┘
Zasada: Warstwa zna tylko warstwę bezpośrednio niższą
+ Separacja odpowiedzialności
- Sztywność, boilerplate
```
#### Microservices
```
┌─────┐ ┌─────┐ ┌─────┐
│User │ │Order│ │Inv- │
│Svc │ │Svc │ │entory│
└──┬──┘ └──┬──┘ └──┬──┘
│ │ │
└────┬────┴────┬────┘
│ │
┌────┴────┐ │
│API Gate │────┘
│ way │
└─────────┘
+ Niezależne wdrożenia, skalowalność
- Złożoność operacyjna, komunikacja
```
#### Event-Driven Architecture (EDA)
```
┌──────────┐ event ┌──────────┐
│ Producer │ ───────────→ │ Event │
└──────────┘ │ Broker │
│(Kafka) │
┌──────────┐ event └────┬─────┘
│ Consumer │ ←─────────────────┘
│ A │
└──────────┘
┌──────────┐ event
│ Consumer │ ←─────────────────┘
│ B │
└──────────┘
+ Loose coupling, skalowalność
- Eventual consistency, debugging
```
#### CQRS (Command Query Responsibility Segregation)
```
Commands Queries
│ │
↓ ↓
┌──────────┐ ┌──────────┐
│ Write │ │ Read │
│ Model │ │ Model │
└────┬─────┘ └────┬─────┘
│ │
↓ ↓
┌──────────┐ sync ┌──────────┐
│ Write │ ─────────→ │ Read │
│ DB │ │ DB │
└──────────┘ └──────────┘
+ Optymalizacja read/write osobno
- Złożoność, eventual consistency
```
#### Hexagonal Architecture (Ports & Adapters)
```
┌─────────────────────────────────────┐
│ Application Core │
│ ┌───────────────────────────────┐ │
Adapter │ │ │ │ Adapter
(REST) ──┼──│► Port Domain Port ◄├──┼── (DB)
│ │ (in) Logic (out) │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────┘
+ Testowalność, niezależność od frameworków
- Więcej kodu (adaptery)
```
#### Saga Pattern (dla transakcji rozproszonych)
```
Orchestration:
┌─────────┐ cmd ┌─────────┐ cmd ┌─────────┐
│ Saga │ ───────→ │ Service │ ───────→ │ Service │
│Orchestr.│ ←─reply── │ A │ ←─reply── │ B │
└─────────┘ └─────────┘ └─────────┘
│ compensation (rollback) jeśli błąd
Choreography:
Service A ──event──→ Service B ──event──→ Service C
↑ │
└────────── compensation event ──────────┘
```
---
### 5. Porównanie wzorców
| Wzorzec | Skalowalność | Złożoność | Use Case |
|---------|--------------|-----------|----------|
| **Monolith** | Niska | Niska | MVP, małe zespoły |
| **Layered** | Średnia | Niska | Enterprise CRUD |
| **Microservices** | Wysoka | Wysoka | Duże systemy |
| **Event-Driven** | Wysoka | Średnia | Real-time, IoT |
| **CQRS** | Wysoka | Wysoka | Read-heavy systems |
---
## 🧠 Mnemoniki
### "LAMP = Layers, API Gateway, Microservices, Pub/Sub":
Ewolucja architektur
### "CQRS = Commands mutate, Queries read":
Rozdzielenie zapisu od odczytu
### "Hexagonal = Inside-Out testing":
Core nie zna zewnętrznych szczegółów
---
## ❓ Pytania dodatkowe
### Q1: "Kiedy wybrać monolith zamiast microservices?"
**Odpowiedź:** Mały zespół (<10), MVP, niejasne granice domen, brak DevOps maturity. "Monolith first" - rozdzielaj gdy wiesz gdzie granice.
### Q2: "Jak CQRS współpracuje z Event Sourcing?"
**Odpowiedź:** Event Sourcing zapisuje zdarzenia (nie stan), CQRS buduje read model z eventów. Razem: audit trail, time-travel, ale złożoność.
### Q3: "Co to jest Strangler Fig Pattern?"
**Odpowiedź:** Migracja z monolitu do microservices. Nowe funkcje jako mikroserwisy, stare stopniowo zastępowane. Routing przez facade. Nazwa od figi dusiciela.
---
## 🎯 Kluczowe punkty
1. **Wzorce** = sprawdzone rozwiązania typowych problemów
2. **Katalogi:** POSA, GoF, EIP, PoEAA
3. **Layered** = separacja, proste, sztywne
4. **Microservices** = niezależność, złożoność ops
5. **Event-Driven** = loose coupling, eventual consistency
6. **CQRS** = osobne modele read/write
---
## 📖 Źródła
1. Buschmann et al. - "POSA Vol. 1"
2. Fowler - "Patterns of Enterprise Application Architecture"
3. Hohpe, Woolf - "Enterprise Integration Patterns"
4. Richardson - "Microservices Patterns"