Wprowadzenie

Często spotykaną definicją mikro-serwisów jest

W inżynierii oprogramowania architektura mikro-serwisów to wzorzec architektoniczny, który organizuje aplikację w zbiór luźno powiązanych, drobnoziarnistych usług, które komunikują się za pośrednictwem lekkich protokołów. Wzorzec ten charakteryzuje się możliwością niezależnego opracowywania i wdrażania usług, poprawiając modułowość, skalowalność i zdolność adaptacji. Wprowadza on jednak dodatkową złożoność, szczególnie w zarządzaniu systemami rozproszonymi i komunikacją między usługami, czyniąc początkową implementację trudniejszą w porównaniu do architektury monolitycznej. (https://en.wikipedia.org/wiki/Microservices)

To samo źródło dalej:

Nie istnieje jedna, powszechnie uzgodniona definicja mikro-serwisów. Ogólnie jednak charakteryzują się one skupieniem na modułowości, a każda usługa jest zaprojektowana wokół konkretnych możliwości biznesowych. Usługi te są luźno powiązane, niezależnie wdrażane i często opracowywane i skalowane oddzielnie, co zapewnia większą elastyczność i zwinność w zarządzaniu złożonymi systemami. Architektura mikro-serwisów jest ściśle powiązana z zasadami takimi jak projektowanie oparte na domenie, decentralizacja danych i zarządzanie oraz elastyczność wykorzystania różnych technologii dla poszczególnych usług, aby jak najlepiej spełnić ich wymagania.

Czytamy “zbiór luźno powiązanych, drobnoziarnistych usług” co niestety “Wprowadza […] jednak dodatkową złożoność, szczególnie w zarządzaniu systemami rozproszonymi i komunikacją między usługami, czyniąc początkową implementację trudniejszą w porównaniu do architektury monolitycznej.” Idąc takim tropem często niestety otrzymujemy to:

Więc jak uniknąć “Gwiazdy Śmieci”?

Architektura

Problem Gwiazdy Śmierci usuwamy rezygnując z “drobnoziarnistych usług, które komunikują się“. Mikro-serwisy to jednak niewątpliwie komponenty (modułowość) czyli niezależne (hermetyzacja) i dziedzinowe (zakres odpowiedzialności) jednostki. Po drugie wymiana danych między komponentami jest jednak czasami konieczna, więc czy to jest sprzeczność? Nie.

Micro serwisy są często pokazywane jako architektura poniżej:

(źr.: https://www.redhat.com/en/topics/microservices/what-are-microservices)

Nie ma żadnej komunikacji między mikro-serwisami ale jest UI. Wielu autorów przedstawia taki oto przykład:

Chris Richardson. (2015, June 15). Building Microservices: Using an API Gateway [Company Blog]. F5, Inc.https://www.f5.com/company/blog/nginx/building-microservices-using-an-api-gateway

Ale przecież np. Zamówienie powstaje na podstawie Koszyka. To jak? Zamówienie ma sobie brać coś bazy danych koszyka? Nie tak powstają monolity i Gwiazdy Śmierci! Czym więc realnie jest API Gateway? Wygląda na to, że jest także szyną integracyjną, która zawiera scenariusze każdej usługi (Przypadek Użycia), np. Zamówienia (na podstawie Koszyka i należnego Upustu), jednak powyższy diagram tego nie tłumaczy. Potrzebny jest pełniejszy projekt.

Projektowanie

Popatrzy na kolejny przykład, który bardzo często pojawia się u autorów w Internecie. Naliczyłem kilkanaście stron w Internecie z tym oto schematem:

Aby opracować projekt z narzędziem CASE odwzorujmy to w UML. Najpierw spróbujmy odtworzyć wymagania w postaci przypadków użycia:

Kolejny krok to wstępna wizja pracy z tym sklepem:

Projektujemy architekturę HLD, która zapewni realizację ww. wymagań (funkcjonalności):

Tu kilka wyjaśnień. Należy pokazać źródło danych takich jak np. aktualna data: API_Environmant (wzorzec architektura heksagonalna). Separujemy otoczenie od naszego kodu adapterami (hermetyzacja ERP i e-Płatności). Komponenty się wzajemnie nie widzą, więc nie zależ od siebie.

Scenariusz realizacji zamówienia:

Powyższe to umowa z zamawiającym, ale to także test odbiorczy (UAT, przypadki użycia, ich specyfikacje, to testy odbiorcze).

Kolejny etap to ostateczny test architektury i projekt implementacji:

Operacja wstawienia treści Koszyka do Zamówienia wymaga zdefiniowania koszyka:

Oraz Zamówienia:

Procedurę wstawienia do zamówienia daty oraz treści koszyka można opisać słownie lub z pomocą diagramu aktywności (to opisałem w innym miejscu: Diagram aktywności UML). Metodę projektowania wraz z bogate literaturą czytelnik z znajdzie w tekście: ICONIX jako zwinny proces projektowania oprogramowania z użyciem UML.

Podsumowanie

Programming is not solely about constructing software—programming is about designing software. [Ipek Ozkaya. ‘Building Blocks of Software Design’. IEEE Software 37, no. 2 (2020): 3–5. https://doi.org/10.1109/MS.2019.2959049.]

Pokazano standardowy sposób tworzenia modeli PIM (Platform Independent Model, OMG.org). Mikro-serwisy to bardzo wygodna, od wielu lat opisywana architektura, pierwotnie nie była tak nazywana, ponad 20 laty temu można znaleźć opis tej idei jako wzorzec SAGA i komponentowa architektura aplikacji. Era “drobienia” jest nowa i szybko się skompromitowała powstaniem Gwiazd Śmierci, i świat wraca powoli do źródeł tej koncepcji.

Jarosław Żeliński

Jarosław Żeliński: Po ukończeniu WAT w 1989 roku pracownik naukowy katedry Transmisji Danych i Utajniania. Od roku 1991 roku, po rozpoczęciu pracy w roli analityka i projektanta systemów przetwarzania informacji, nieprzerwanie realizuje kolejne projekty dla urzędów, firm i organizacji. Od 1998 roku prowadzi także samodzielne studia i prace badawcze z obszaru analizy systemowej i modelowania systemów (modele jako przedmiot badań: ORCID), publikując je nieprzerwanie także na tym blogu. Od 2005 roku, jako wykładowca akademicki wizytujący (nieetatowy), prowadzi wykłady i laboratoria (ontologie i modelowanie systemów informacyjnych, aktualnie w Wyższej Szkole Informatyki Stosowanej i Zarządzania pod auspicjami Polskiej Akademii Nauk w Warszawie.). Od 2020 roku na stałe mieszka w Szkocji (Zjednoczone Królestwo), nadal realizuje projekty dla firm i organizacji także w Polsce. Każdy z Państwa może zostać Mecenasem Bloga: Chcę zostać Mecenasem Autora Bloga

Ten post ma 2 komentarzy

  1. Marcin

    Osobiście popularności mikrousług jako stylu architektonicznego doszukuję się w tym, że jest on bardzo na rękę wszelkiej maści dostawcom chmury obliczeniowej i platform programistycznych, które zarabiają ogromne pieniądze na kolejnych firmach pchających się w ten pomysł, zwłaszcza wdrażających swoje rozwiązania w PaaS.

    Zauważmy co się tutaj zadziało. Zamiast skalować infrastrukturę pod SUMARYCZNE zapotrzebowanie na moc obliczeniową naszego rozwiązania płacimy za każdą LOGICZNĄ jednostkę naszej architektury lub (za ArchiMate) za każdy element behawioralny warstwy aplikacji.

    Drobnienie usług do granic absurdu (słyszałem już nawet o nanousługach) jest im niesłychanie na rękę.

    Złożoność wynika z dziedziny problemu, a od projektanta i wykonawcy rozwiązania zależy jak będzie się to przekładało na koszty i czy powstanie owa Gwiazda Śmierci.

    1. Jarosław Żeliński

      Osobiście mam podobne odczucia. Po drugie pracując na poziomie kodu nie widać architektury całości, w efekcie powstają “usługi”, których kod mieści na góra kilku ekranach programisty (jeden ekran to ok. 60 linii), bo koder bez widoku architektury nie jest w stanie pracować inaczej, w efekcie powstają gwiazdy śmierci z “usługami” wielkości ziarnka piasku i tysiącami wywołań między nimi.

Skomentuj Marcin Anuluj pisanie odpowiedzi

Ta strona używa Akismet do redukcji spamu. Dowiedz się, w jaki sposób przetwarzane są dane Twoich komentarzy.