Residuality Theory w praktyce PHP
Wszystkie testy są zielone. Czy architektura jest dobra?
Leszek Prabucki · PHPers · 16.09.2026
PUNKT WYJŚCIA
Klient → PHP-FPM → Orders DB → Mail API → HTTP 201
ZAŁOŻENIE 1
User = nabywca = płatnik
ZAŁOŻENIE 2
Mail API jest dostępne
ZAŁOŻENIE 3
Wszystko kończy się w jednym HTTP request
„Naïve architecture” = punkt wyjścia oparty na obecnym rozumieniu świata, nie zły kod.
RESIDUALITY THEORY · BARRY M. O’REILLY
Przy których założeniach nasza architektura przestaje być optymalna? Co pozostanie, kiedy te założenia się spełnią? Jak zachowa się nasz system?
STRESSOR
Stresorem może być zdarzenie realistyczne lub zupełnie absurdalne, z pogranicza „nieznanych niewiadomych”. Celem nie jest idealne trafienie w przyszłość, ale sprawdzenie zachowania architektury pod wpływem losowych anomalii.
Stresory nie ograniczają się tylko do awarii sprzętu czy przeciążenia infrastruktury.
STRESSOR
AWARIA
Mail API
nie odpowiada
ZMIANA BIZNESU
Firma chce kupować B2B
SUKCES
Sprzedaż rośnie ×100
Stresor = fakt, którego nie uwzględnia nasz model
RESIDUE
01
STRESOR
→
02
CO POZOSTAŁO?
→
03
REAKCJA BIZNESU
→
04
ULEPSZONE RESIDUE
Residue nie jest komponentem.
To stan systemu po stresie - dobry, zły albo niewystarczający.
CASE STUDY · STRESOR TECHNICZNY
$orderId = $this->orders->add($cart); // DB ✓ $this->mailer->sendConfirmation($orderId); // ✕ return $this->response->created($orderId); // —
Zamówienie istnieje ✓
Mail nie wyszedł ✕
Klient widzi błąd ✕
Założenie przykładu: zapis zamówienia został już zatwierdzony.
REAKCJA BIZNESOWA → MECHANIZM
$orderId = $this->db->transactional(function () use ($cart) {
$id = $this->orders->add($cart);
$this->outbox->append(new OrderPlaced($id));
return $id;
});
return $this->response->created($orderId);JEDNA TRANSAKCJA
Orders + Outbox
↓
Worker
↓
Mail API
Order: accepted · Notification: pending / failed / sent
CASE STUDY · STRESOR BIZNESOWY
BYŁO
User = loguje się = zamawia = kupuje = płaci
PRACOWNIK
składa zamówienie
FIRMA
jest nabywcą
PRZEŁOŻONY
zatwierdza
KSIĘGOWOŚĆ
rozlicza
+ isCompany ≠ rozdzielenie znaczeń i odpowiedzialności
ATTRACTOR + LOOPING
Mail API nie działa
Konto dostawcy zawieszone
Nowe integracja dla zamówień z WMD
→
POWRACAJĄCA KONFIGURACJA
Zamiar biznesowy przyjęty.
Zewnętrzny efekt czeka.
Osobny konsument do obsługi.
Attractor: powracająca konfiguracja · Looping: nowe stresory korzystają z wcześniejszych pozostałości
RESIDUAL ARCHITECTURE
MAIL UNAVAILABLE
Outbox + worker
B2B
Rozdzielone role
HTTP OVERLOAD
Izolacja procesów i wydzielenie ich z głownego procesu HTTP
↘ ↓ ↙
Jedna spójna architektura
Integracja ujawnia styki: wspólna baza · wspólna kolejka · sprzeczne statusy
CONTAGION ANALYSIS
| Stresor | Katalog HTTP | Checkout HTTP | Worker maili |
|---|---|---|---|
| Wolne API maili | 0 | 0 | 1 |
| Baza niedostępna | 1 | 1 | 1 |
| Raporty zajmują PHP-FPM | 1 | 1 | 0 |
1 = wpływ przy przyjętych założeniach. 0 nie oznacza wiecznej odporności.
01
Zbuduj teraz
02
Zostaw tanią opcję adaptacji
03
Udokumentuj i obserwuj
Najpierw odkrywamy. Potem wracamy do kosztu, niezawodności i kompromisów. To można ładnie połączyć z architekturą ewolucyjną i funkcjami dopasowania (fitness function)
ITERACJA
Punkt
wyjścia
→
Flow
analysis
→
Stresory
+ residues
→
Integracja
+ contagion
Koszt · ATAM · FMEA
→
Nowe stresory sprawdzające
↺
Każdy obrót pętli sprawdza skutki wcześniejszych decyzji.
EMPIRYCZNE SPRAWDZENIE
Zestaw projektowy ≠ zestaw sprawdzający
ARCHITEKTURA A
Punkt wyjścia
ARCHITEKTURA B
Residual architecture
TEN SAM ZESTAW
NOWYCH STRESORÓW
działa / adaptuje się z kosztem / nie radzi sobie
Najpierw ustal, co w tej historii znaczy „przetrwanie”.
Stresor podważa model, i to nie tylko obciążenie czy wolumen ruchu sieciowego.
Residue pokazuje, co pozostało i czego name brakuje.
Integruj odpowiedzi - i stresuj ponownie.
Co pozostanie z naszego systemu,
kiedy przestaniemy mieć rację?
PODSTAWA
Barry M. O’Reilly
Residues: Time, Change, and Uncertainty in Software Architecture
Software Architektur im Stream #279
software-architektur.tv/transcriptions/279.html