Tak mi się nasunęło na myśl podczas czytania tej dyskusji, że właściwie nie istnieje jakaś ogólna, przyjęta definicja architektury mikroserwisowej, więc równie dobrze wszyscy mogą mieć rację. To z czym się zetknąłem, to "zbiór małych, luźno powiązanych usług, o dobrze zdefiniowanych API". Natomiast jeżeli patrzymy na to nieco szerzej, to jest to wyniesienie ogólnie znanych zasad SOLID do poziomu osobnych usług. Nic nie stoi na przeszkodzie, żeby zamiast mieć spaghetti code mieć spaghetti microservices i być zmuszonym, do zmiany 15 usług w momencie implementowania prostej funkcji systemu. Nic nie stoi na przeszkodzie, żeby mieć dobrą architekturę na poziomie modułów monolitu.
Nie ma też jasnej odpowiedzi na pytanie, czy "mikroserwisy są lepsze od monolitu, czy odwrotnie". Każde z tych rozwiązań ma swoje zalety i koszty. W przypadku mikroserwisów dość oczywistym kosztem jest np. konieczność posiadania CI/CD, bardziej złożonego środowiska uruchomieniowego. Zalety, już wymieniał @Krolik , ale dość często korzysta się też z łatwości zarządzania separacją usług, bo tutaj nie da się na szybko sięgnąć do bazy danych innej usługi i wyciągnąć trochę danych tak jak nam się w danym momencie podoba. Skalowalność w porównaniu z monolitem, nawet po użyciu wszelkich możliwych sztuczek też jest nieporównywalna (chociażby dlatego, że mała usługa uruchamia się szybciej niż duża usługa). Natomiast pozostaje pytanie, czy w danym projekcie zalety któregoś z tych podejść przewyższają koszty. Problem polega na tym, że dość często decyzja o użyciu jakiejś technologii następuje po tym, jak ktoś obejrzał filmik, przeczytał książkę, czy pojechał na jakąś konferencję i nasłuchał się o zaletach danego podejścia, natomiast rzadko kiedy usłyszał o wadach/kosztach. Patrząc na mikroserwisy te koszty są spore i oprócz bardziej złożonego deploymentu, będzie to konieczność głębszego zrozumienia problemu przed rozpoczęciem pracy, rezygnacja z ACID i konieczność walki z eventual consistency, sagami, czy innym event sourcing. Trzeba będzie się zastanowić jak zarządzać wspólnymi częściami kodu itd.