Porozmawiajmy pozytywnie i negatywnie o podejściu mikrousługowym.
Pierwsze negatywy. Podczas tworzenia mikrousług dodajesz nieodłączną złożoność kodu. Dodajesz koszty ogólne. Utrudniasz replikację środowiska (np. Dla programistów). Utrudniasz debugowanie sporadycznych problemów.
Pozwól mi zilustrować prawdziwy minus. Rozważ hipotetycznie przypadek, w którym podczas generowania strony wywoływanych jest 100 mikrousług, z których każda robi właściwie 99,9% czasu. Ale w 0,05% przypadków dają one złe wyniki. I w 0,05% przypadków żądanie połączenia jest powolne, gdy, powiedzmy, wymagany jest limit czasu TCP / IP do nawiązania połączenia, co zajmuje 5 sekund. Około 90,5% czasu Twoje zapytanie działa idealnie. Ale w około 5% przypadków wyniki są błędne, a w około 5% przypadków strona jest powolna. I każda niepowtarzona powtórka ma inną przyczynę.
O ile nie zastanowisz się nad narzędziami do monitorowania, odtwarzania itp., Przerodzi się to w bałagan. Zwłaszcza gdy jedna mikrousługa wywołuje inną, która wywołuje kolejną głębokość kilku warstw. A gdy pojawią się problemy, z czasem będzie coraz gorzej.
OK, to brzmi jak koszmar (a więcej niż jedna firma stworzyła dla siebie ogromne problemy, idąc tą ścieżką). Sukces jest możliwy tylko wtedy, gdy wyraźnie zdajesz sobie sprawę z potencjalnego minusu i konsekwentnie pracujesz nad tym, aby go rozwiązać.
A co z tym monolitycznym podejściem?
Okazuje się, że aplikacja monolityczna jest tak samo łatwa do modularyzacji jak mikrousługi. A wywołanie funkcji jest zarówno tańsze, jak i bardziej niezawodne w praktyce niż wywołanie RPC. Możesz więc opracować to samo, z wyjątkiem tego, że jest bardziej niezawodny, działa szybciej i wymaga mniej kodu.
OK, więc dlaczego firmy wybierają podejście mikrousług?
Odpowiedź brzmi, ponieważ podczas skalowania istnieje ograniczenie tego, co można zrobić z aplikacją monolityczną. Po tylu użytkownikach, tylu żądaniach itd. Dochodzi się do punktu, w którym bazy danych nie skalują się, serwery WWW nie mogą przechowywać kodu w pamięci i tak dalej. Ponadto podejścia oparte na mikrousługach umożliwiają niezależne i przyrostowe aktualizacje aplikacji. Dlatego architektura mikrousług jest rozwiązaniem do skalowania aplikacji.
Moją osobistą zasadą jest to, że przejście od kodu w języku skryptowym (np. Python) do zoptymalizowanego C ++ ogólnie może poprawić 1-2 rzędy wielkości zarówno pod względem wydajności, jak i wykorzystania pamięci. Przejście do architektury rozproszonej zwiększa wymagania co do zasobów, ale umożliwia skalowanie w nieskończoność. Możesz sprawić, że architektura rozproszona będzie działać, ale jest to trudniejsze.
Dlatego powiedziałbym, że jeśli zaczynasz osobisty projekt, idź monolitycznie. Dowiedz się, jak to zrobić dobrze. Nie rozpowszechniaj, ponieważ (Google | eBay | Amazon | etc) są. Jeśli lądujesz w dużej firmie, która jest dystrybuowana, zwróć szczególną uwagę na to, jak działają, i nie spieprz tego. A jeśli skończysz z przejściem, bądź bardzo, bardzo ostrożny, ponieważ robisz coś trudnego, co łatwo jest bardzo, bardzo źle.
Ujawnienie, mam blisko 20-letnie doświadczenie w firmach każdej wielkości. I tak, widziałem zarówno monolityczne, jak i rozproszone architektury z bliska i osobiście. Opiera się na tym doświadczeniu, które mówię wam, że rozproszona architektura mikrousług jest naprawdę czymś, co robisz, ponieważ musisz, a nie dlatego, że jest w jakiś sposób czystsza i lepsza.