mirror of
https://github.com/kuhyx/praca_magisterska.git
synced 2026-07-04 13:43:05 +02:00
235 lines
9.4 KiB
Markdown
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"
|