Monolit to system zaprojektowany do działania jako pojedyncza jednostka. Wszystko jest zaimplementowane w obrębie jednej aplikacji, która stanowi jednostkę wdrożeniową. Elementy znajdujące się w środku są połączone oraz zależne od siebie przez co są ściśle powiązane. Jeśli na przykład projektowalibyśmy sklep internetowy jako system monolityczny to znajdowałoby się w nim wszystko od autoryzacji przez produkty po zamówienia.
Zalety
Szybka, niezawodna oraz bezpieczna komunikacja
Jako, że monolit hermetyzuje w sobie wszystkie elementy to komunikacja między nimi jest bardzo szybka i niezawodna z tego względu, że jest bezpośrednia a nie z wykorzystaniem sieci. Dzięki temu jest ona także bezpieczna i prosta ponieważ nie musimy się martwić błędami spowodowanymi siecią czy też zabezpieczeniem przesyłanych danych.
Łatwe wdrożenie i prostota infrastruktury
System monolityczny jest pojedynczą aplikacją, więc jej wdrożenie jest bardzo proste. Co za tym idzie infrastruktura potrzebna do jego działania również nie jest skomplikowana. Oznacza to najczęściej mniej serwerów oraz wdrożeń.
Szybki rozwój aplikacji
Przez to, że w monolicie nie musimy się zastanawiać jak podzielić nasze moduły (ponieważ ich nie mamy) oraz nie musimy zaprzątać sobie głowy komunikacją przez sieć i planowaniem infrastruktury rozwój aplikacji idzie bardzo sprawnie i szybko (przynajmniej na początku).
Łatwość skalowania
Monolit można w bardzo łatwy i szybki sposób skalować. Jako, że jest on pojedynczą aplikacją (jednostką wdrożeniową) to cały proces skalowania sprowadza się do uruchomienia kolejnej instancji.
Wady
Problemy z późniejszym rozwojem aplikacji
Im dalej w las tym nasza aplikacja staje się coraz większa. W pewnym momencie dojdziemy do punktu w którym rozwój monolitu stanie się problematyczny. Jako, że wszystkie jego elementy się ze sobą komunikują oraz są zależne od siebie to pojedyncza zmiana w którymś z nich może oddziaływać na cały system. Ponadto nawet jeśli do zmiany dojdzie tylko w jednym miejscu (co jest rzadko spotykane) to i tak będziemy zmuszeni do ponownego wdrożenia całej aplikacji, ponieważ monolit jest jedną jednostką wdrożeniową. Nie możemy podmienić tylko jego części, tak jak w przypadku mikroserwisów. Wdrażamy albo całość albo nic.
Problem ze zrozumieniem
Jeśli nasza aplikacja urośnie do dużych rozmiarów to jej zrozumienie może okazać się bardzo problematyczne szczególnie w przypadku wdrożenia nowej osoby. Przez to, że nasze elementy są zależne od siebie i ściśle powiązane to aby dokonać jakiejś zmiany jesteśmy zmuszeni do analizy nie tylko danego fragmentu lecz całej aplikacji.
Ograniczona skalowalność
Ale jak to? Przecież wcześniej wspomniałem, że aplikacje monolityczną można skalować w bardzo prosty sposób. Tak jest! To prawda natomiast jesteśmy zmuszeni do skalowania całej aplikacji. Nie jesteśmy w stanie skalować tylko pojedynczego fragmentu. Co sprawia, że skalujemy rzeczy, które nie koniecznie wymagają skalowania. Powoduje to znaczy wzrost kosztów.
Kruchość i nieodporność
W przypadku kiedy w naszym monolicie wystąpi jakiś błąd to z perspektywy systemu nie ma znaczenia czy błąd wystąpił w procesie, który jest bardzo ważny dla biznesu, czy np. w loggerze, który nie ma większego znaczenia. Jeśli nastąpi wyciek pamięci lub nadmierna utylizacja procesora lub co gorsza błąd, którego nie wyłapiemy to efekt zawsze będzie taki sam. Wpłynie on na działanie całej aplikacji.