Wybierz monolit gdy
- Projekt jest w fazie MVP/startupu
- Zespół jest mały (do 5-10 osob)
- Domena biznesowa nie jest jeszcze dobrze poznana
- Potrzebujesz szybko dostarczyc produkt
- Budzet na infrastrukture jest ograniczony
Wybor architektury systemu to jedna z najwazniejszych decyzji projektowych, która wpływa na cały cykl zycia aplikacji. Dwie dominujace strategie to architektura monolityczna i architektura mikroserwisowa. Każde podejscie ma swoje zalety i ograniczenia, a wybor zależy od kontekstu projektu.
Nie istnieje uniwersalnie “lepsza” architektura - kluczem jest dopasowanie do wymagan biznesowych, wielkosci zespołu i etapu rozwoju produktu.
Monolit to aplikacja zbudowana jako pojedyncza, spojona jednostka wdrozeniowa. Wszystkie funkcjonalnosci (autentykacja, logika biznesowa, dostep do danych) znajduja się w jednym procesie i współdziela ten sam kod źródłowy.
Cechy charakterystyczne:
Mikroserwisy to podejscie architektoniczne, w którym system składa się z wielu małych, niezaleznych usług. Każdy mikroserwis odpowiada za jedna funkcjonalnosc biznesowa i może być wdrazany niezależnie.
Cechy charakterystyczne:
┌─────────────────────────────────────────┐│ MONOLIT ││ ┌─────────┐ ┌─────────┐ ┌─────────┐ ││ │ Auth │ │ Orders │ │Products │ ││ └─────────┘ └─────────┘ └─────────┘ ││ ┌─────────┐ ┌─────────┐ ┌─────────┐ ││ │ Users │ │Payments │ │ Reports │ ││ └─────────┘ └─────────┘ └─────────┘ ││ │ ││ ┌────────┴────────┐ ││ │ Baza danych │ ││ └─────────────────┘ │└─────────────────────────────────────────┘┌─────────┐ ┌─────────┐ ┌─────────┐│ Auth │ │ Orders │ │Products ││ Service │ │ Service │ │ Service ││ DB │ │ DB │ │ DB │└────┬────┘ └────┬────┘ └────┬────┘ │ │ │ └─────────────┼─────────────┘ │ ┌───────┴───────┐ │ API Gateway │ └───────────────┘| Aspekt | Monolit | Mikroserwisy |
|---|---|---|
| Złożoność początkowa | Niska | Wysoka |
| Wdrozenie | Proste (1 artefakt) | Złożone (wiele serwisow) |
| Skalowalnosc | Pionowa (cały system) | Pozioma (per serwis) |
| Technologie | Jedna technologia | Możliwość polyglot |
| Testowanie | Łatwiejsze E2E | Trudniejsze E2E |
| Debugging | Prostszy | Wymaga distributed tracing |
| Zespół | Mniejszy, współpracujący | Większy, autonomiczne zespoły |
| Czas do produkcji | Szybszy start | Wolniejszy start |
| Odpornosc na błędy | Awaria = cały system | Izolacja błędów |
ecommerce-monolith/├── src/│ ├── auth/│ │ ├── AuthController.ts│ │ ├── AuthService.ts│ │ └── User.entity.ts│ ├── orders/│ │ ├── OrderController.ts│ │ ├── OrderService.ts│ │ └── Order.entity.ts│ ├── products/│ │ ├── ProductController.ts│ │ └── Product.entity.ts│ └── app.module.ts├── package.json└── docker-compose.ymlPrzykład wywołania wewnętrznego (monolit):
// OrderService.ts - bezposrednie wywołanieclass OrderService { constructor( private productService: ProductService, private paymentService: PaymentService ) {}
async createOrder(userId: string, items: CartItem[]) { // Bezposrednie wywołanie - ta sama przestrzen pamieci const products = await this.productService.validateStock(items); const payment = await this.paymentService.processPayment(userId, total); return this.orderRepository.save({ userId, items, paymentId: payment.id }); }}ecommerce-microservices/├── auth-service/│ ├── src/│ ├── Dockerfile│ └── package.json├── order-service/│ ├── src/│ ├── Dockerfile│ └── package.json├── product-service/│ ├── src/│ ├── Dockerfile│ └── package.json├── api-gateway/│ └── ...└── docker-compose.ymlPrzykład wywołania miedzy serwisami (mikroserwisy):
// OrderService.ts - wywołanie HTTP do innego serwisuclass OrderService { constructor(private httpClient: HttpClient) {}
async createOrder(userId: string, items: CartItem[]) { // Wywołanie sieciowe do innego serwisu const products = await this.httpClient.post( 'http://product-service:3001/api/validate-stock', { items } );
const payment = await this.httpClient.post( 'http://payment-service:3002/api/process', { userId, amount: total } );
return this.orderRepository.save({ userId, items, paymentId: payment.id }); }}Wybierz monolit gdy
Wybierz mikroserwisy gdy