Kontekst biznesowy i paraliż release'ów#
Platforma logistyczna B2B obsługująca tysiące operacji łańcucha dostaw dziennie mierzyła się z rosnącym kosztem utrzymania 8-letniego monolitu o objętości przekraczającej 450 000 linii kodu.
Wraz ze wzrostem złożoności modułów rozliczeniowych i integracji kurierskich, system zaczął paraliżować rozwój całego biznesu:
- Cykl release'u trwający ponad 30 dni: Ze względu na ogromne powiązania w kodzie (tzw. Big Ball of Mud), zespół inżynieryjny bał się jakichkolwiek wdrożeń.
- Niekontrolowane regresje: Zmiana w module kalkulacji stawek przewozowych potrafiła wywołać błąd w wystawianiu faktur VAT.
- Długi manualny proces QA: Przed każdym wdrożeniem zespół spędzał od 3 do 5 dni na ręcznych testach regresyjnych.
Zarząd stanął przed dylematem: zarządzić 18-miesięczny „Big Bang Rewrite” (przepisanie wszystkiego od nowa) z ryzykiem katastrofy budżetowej, czy znaleźć bezpieczną alternatywę inżynieryjną.
Architektura przejściowa: Wzorzec Strangler Fig#
Zdecydowaliśmy o natychmiastowym odrzuceniu koncepcji przepisania systemu od nowa. Zamiast tego wdrożyliśmy wzorzec Strangler Fig (Duszącego Figowca) w połączeniu z Traefik Reverse Proxy oraz architekturą Vertical Slice Architecture.
[Klienci B2B / API Consumers]
│
▼
[Traefik Reverse Proxy (Dynamic Routing)]
│ │
│ (90% legacy ruchu) │ (Nowe wycięte domeny)
▼ ▼
[8-letni Monolit] [Nowe Vertical Slices (DDD)]
(Baza Legacy) - Moduł Fakturowania
- Moduł Dispatchingu
(Dedykowana baza PostgreSQL)
▲
│ (Event Sync / RabbitMQ)
▼
[CDC / Debezium Outbox]
Kluczowe założenia transformacji:#
- Zero Downtime: Ani na minutę nie zatrzymano procesowania przesyłek i generowania przychodu.
- Krokowy podział domenowy: Zastosowaliśmy podejście Domain-Driven Design (DDD) i Event Storming, aby wyznaczyć precyzyjne granice kontekstów (Bounded Contexts).
- Outbox Pattern & Change Data Capture (CDC): Synchronizacja danych między bazą legacy a nowymi mikrousługami opierała się na mechanizmie Outbox i RabbitMQ, zapewniając spójność ostateczną (Eventual Consistency).
Wdrożenie techniczne krok po kroku#
Etap 1: Warstwa Edge Routing (Traefik)#
Umieściliśmy Traefik na brzegu sieci jako inteligentny reverse proxy. Początkowo 100% ruchu trafiało do starego monolitu. W miarę wdrażania kolejnych domen, reguły routingu przekierowywały ruch do nowych modułów bez konieczności rekonfiguracji klientów API.
Etap 2: Ekstrakcja modułu fakturowania do Vertical Slice#
Pierwszą domeną poddaną transformacji było fakturowanie. Zamiast warstwowego podziału (Controllers -> Services -> Repositories), zastosowaliśmy architekturę Vertical Slice – cała logika danej komendy biznesowej (np. GenerateInvoiceCommand) znajduje się w jednym autonomicznym katalogu.
Etap 3: Automatyzacja GitOps CI/CD i Kontrakty OpenAPI#
Wprowadziliśmy rygorystyczne testy kontraktowe (Consumer-Driven Contract Testing) z wykorzystaniem OpenAPI. Czas wykonania pipeline'u CI/CD w Dockerze wyniósł zaledwie 4 minuty.
Rezultaty biznesowe i inżynieryjne#
- Częstotliwość release'ów: Wzrost z 1 wdrożenia w miesiącu do 14 wdrożeń w tygodniu (+56x).
- Czas wykrywania błędów i regresji: Skrócony z 3–5 dni manualnych testów do 4 minut w zautomatyzowanym CI/CD (natychmiastowy feedback loop).
- Dostępność systemu w trakcie migracji: 100.00% uptime (0.00 sekund przestoju) dla partnerów logistycznych.
- Morale zespołu inżynieryjnego: Eliminacja strachu przed deploymentem w piątek – wdrożenia stały się powtarzalnym, bezpiecznym procesem tła.
Lekcja dla liderów technologii#
Przepisywanie całego systemu od zera to najczęstsza przyczyna katastrof budżetowych w branży IT. Wzorzec Strangler Fig udowadnia, że można dekomponować nawet najbardziej zagmatwany monolit, jednocześnie generując stały zwrot z inwestycji (ROI) już po pierwszych tygodniach pracy.

