Wprowadzenie
Każdy founder i CTO marzy o skalowalnym SaaS. Ale rzeczywistość bywa brutalna: aplikacja, która świetnie działała na 100 użytkownikach, przy 1000 zaczyna zwalniać, a przy 10 000 – dosłownie się sypie. I wtedy zaczyna się panika, nocne wdrożenia i przepalanie budżetu na awaryjne serwery.
Jako praktyk widziałem wiele takich historii. I w większości przypadków problem nie leży w kodzie, ale w architekturze. Oto 3 błędy, które regularnie zabijają skalowalność SaaS – i jak ich uniknąć.
1. Monolit, który udaje mikroserwisy
Popularne powiedzenie brzmi: „najpierw monolit, potem mikroserwisy”. I to prawda. Ale często firmy próbują przeskoczyć etap dojrzałości i wdrażają mikroserwisy zbyt wcześnie – lub co gorsza, tworzą „rozproszony monolit”, który łączy wady obu światów.
Przykład z życia: Klient z branży e-commerce (SaaS dla małych sklepów) zdecydował się na mikroserwisy od pierwszego dnia. Każda funkcjonalność – katalog, koszyk, płatności, użytkownicy – dostała osobny serwis. Po dwóch latach mieli 15 serwisów, ale każda transakcja wymagała komunikacji między 6 z nich. Opóźnienia narastały, a debugowanie zamieniało się w koszmar. W rzeczywistości mieli monolit rozbity na części, które były ze sobą silnie sprzężone.
Jak to naprawić? Zamiast wyprzedzać skalowalność, zastosuj zasadę „modularnego monolitu”. Trzymaj kod w jednej bazie, ale z wyraźnymi modułami i interfejsami. Dopiero gdy moduł wymaga niezależnego skalowania (np. płatności rosną szybciej niż reszta), wyodrębniaj go jako osobny serwis. I nigdy, przenigdy nie dziel bazy danych na osobne schematy, dopóki nie jest to absolutnie konieczne – to jeden z najdroższych błędów.
2. Baza danych jako wąskie gardło
Większość problemów wydajnościowych SaaS sprowadza się do bazy danych. A najczęstszy błąd? Traktowanie relacyjnej bazy jak jedynego słusznego rozwiązania.
Przykład: Aplikacja SaaS do zarządzania projektami. Wszystkie dane – zadania, użytkownicy, komentarze – lądowały w PostgreSQL. Przy 500 użytkownikach działało. Przy 2000 zaczęły się timeouty. Klient próbował skalować wertykalnie (większe maszyny), ale koszty rosły liniowo, a poprawka była chwilowa. Problem leżał w tym, że niektóre zapytania (np. dashboard z liczbą zadań na użytkownika) wymagały joinów na milionach wierszy.
Jak to naprawić? Zastosuj strategię CQRS (Command Query Responsibility Segregation). Oddziel operacje zapisu od odczytu. Do odczytów użyj dedykowanych widoków materializowanych lub bazy NoSQL. W tym konkretnym przypadku wystarczyło dodać Redis jako cache dla dashboardów i Elasticsearch do wyszukiwania. Koszt? Kilka godzin pracy, a nie tysiące na większe serwery.
Pamiętaj też o indeksowaniu, ale nie przesadzaj – zbyt wiele indeksów spowalnia zapis. Regularnie analizuj wolne zapytania za pomocą EXPLAIN ANALYZE i usuwaj nieużywane indeksy.
3. Ignorowanie limitów API zewnętrznych
SaaS często polega na zewnętrznych API – płatności (Stripe), e-mail (SendGrid), AI (OpenAI). I tu tkwi pułapka: zakładasz, że te API są nieskończenie szybkie i dostępne. A one mają limity, opóźnienia i awarie.
Przykład: SaaS do automatycznej obsługi klienta integrował się z OpenAI do generowania odpowiedzi. Każde żądanie czekało synchronicznie na odpowiedź modelu. Przy niskim ruchu działało. Gdy ruch wzrósł, czas odpowiedzi wydłużył się do 10+ sekund, a koszty API poszybowały (OpenAI liczy za tokeny, ale i za liczbę żądań). Klient stracił wielu użytkowników, bo aplikacja była „niedziałająca”.
Jak to naprawić? Użyj kolejki zadań (np. RabbitMQ, AWS SQS) i przetwarzania asynchronicznego. Użytkownik wysyła żądanie, ale odpowiedź generuje się w tle. Frontend może odpytywać o status lub dostać webhook. Dodatkowo wprowadź rate limiting i circuit breaker – gdy API zewnętrzne jest przeciążone, aplikacja powinna elegancko obsłużyć błąd, a nie czekać w nieskończoność.
Nie zapomnij o cache’owaniu odpowiedzi – jeśli kilku użytkowników zadaje to samo pytanie, nie ma sensu za każdym razem płacić OpenAI. Zastosuj prosty cache w Redis z TTL.
Podsumowanie
Skalowalność to nie tylko kod. To architektura, która przewiduje wzrost, ale nie wyprzedza go przesadnie. Unikaj tych trzech błędów:
- Mikroserwisy zbyt wcześnie – zacznij od modularnego monolitu.
- Baza danych jako bottleneck – oddziel odczyty od zapisów, używaj cache.
- Synchroniczne zależności od zewnętrznych API – kolejki i asynchroniczność to must-have.
Pamiętaj: skalowalność to maraton, nie sprint. Lepiej mieć prostą architekturę, która działa i można ją stopniowo ulepszać, niż skomplikowany system, który pada przy pierwszym większym obciążeniu. Jeśli potrzebujesz wsparcia w audycie architektury swojego SaaS – JurskiTech pomoże Ci znaleźć wąskie gardła zanim stracisz klientów.


