Dlaczego nudne decyzje były moimi najlepszymi decyzjami
Kiedyś myślałem, że bycie dobrym programistą oznacza pisanie skomplikowanego kodu.
Myliłem się.
Projektując MVP dla kliniki medycznej, która docelowo ma stać się rozwiązaniem SaaS typu multi-tenant, wyciągnąłem bolesną lekcję. Kod to najłatwiejsza część. Najtrudniejsze jest zdecydowanie, czego NIE budować.
Kusiło mnie, aby użyć mikroserwisów, zdarzeń i Kubernetes. To świetnie wygląda w CV. Ale mikroserwisy mają wysoką cenę. Płaci się za nie skomplikowanymi potokami (pipelines), problemami z wersjonowaniem i trudnym debugowaniem.
Przy trzyosobowym zespole i niewielkiej liczbie użytkowników, mikroserwisy to po prostu dodatkowa praca. Rozwiązujesz problemy, których jeszcze nie masz.
Zamiast tego wybrałem prostą architekturę warstwową z .NET 8 i PostgreSQL. Kosztuje to około 30 USD miesięcznie.
Skupiłem się na mądrych, tanich decyzjach, których zmiana w przyszłości byłaby kosztowna:
• Dodałem kolumnę TenantId do każdej tabeli od pierwszego dnia. • Użyłem Dockera od pierwszego commita. • Stworzyłem interfejs dla dostawcy WhatsApp.
Każda z tych rzeczy zajęła jedno popołudnie. Dzięki nim przyszłe migracje stały się prostymi zmianami w konfiguracji.
Nauczyłem się również dopasowywać wzorce do potrzeb biznesowych.
Na przykład zastosowałem wzorzec Outbox dla powiadomień WhatsApp. Rezerwacja wizyty musi być szybka i niezawodna. Wysłanie wiadomości może nastąpić dwie sekundy później. Jeśli WhatsApp będzie działał wolno, rezerwacja i tak zostanie przetworzona.
Jednak odrzuciłem „spójność ostateczną” (eventual consistency) w przypadku dokumentacji medycznej. Diagnoza medyczna musi być dokładna i natychmiastowa. W ochronie zdrowia wymogi prawne są w rzeczywistości wymogami architektonicznymi.
Przyjrzałem się również twardym liczbom.
Konfiguracja Kubernetes (EKS) kosztowałaby od 545 do 615 USD miesięcznie. Konfiguracja AWS Fargate kosztuje od 350 do 420 USD miesięcznie.
To oszczędność ponad 150 USD każdego miesiąca. Wybrałem Fargate, ponieważ przy naszej obecnej skali jest prostszy i tańszy.
Moja strategia jest prosta:
- Najpierw stosuj warstwy.
- Używaj zdarzeń, gdy zależności zewnętrzne (takie jak WhatsApp) zaczynają wpływać na Twój system.
- Przejdź na mikroserwisy dopiero wtedy, gdy skala i wielkość zespołu będą tego wymagać.
Nie projektuj pod dwudziestu klientów, których jeszcze nie masz. Buduj dla klienta, który płaci Ci dzisiaj.