Wątek przeniesiony 2023-09-24 17:30 z Inżynieria oprogramowania przez Riddle.

Microservices task manager

0

Witam, chce stworzyc nowy modul do sysytemu jakim jest task manager. Moze nie taki duzy jaki jira, ale takie podstawowe rzeczy. Task manager chce utworzyc jako microservice z oddzielna baza danych oraz API. Endpointy by zwracaly HTML, czyli np formularz add task czy task list itd. Bede potrzebowal kilka informacji ze strony monolith tj informacje o firmie czy chociazby o uzytkowniku. I teraz troche nie wiem jak to wszysto polaczyc w jedna calosc. Wydaje mi sie, zeby zrobic iframe i dodac to do monolith appki. Zeby uniknac zabawy z CSS/JavaScript etc. Informacje tj fima czy user, chyba bede musial przechowywac w obu bazach danych, monolith i miscroservice. Tylko tutaj jest moje glowne pytanie. Trzymanie tych samych danych w dwoch miejscach to pytanie o klopoty. Nawet z najprostszymi danymi czesto jest problem z sync. To ktos usunie kolumne, ktos inny doda kolumne, czy zmieni walidacje itd itd. Macie moze jakis lepsze pomysly na task manager w miscroservice? Nie wiem czy to w ogole ma sens upychac w taki microservice? I czy ma sense, zeby serwowa HTML?

Sam microserwis bedzie stal na PHP, Pgsql.

2

Wg mnie duży błąd popełniasz przy założeniu że mikroserwisy zwracają html.
Iframe to też troszkę strzał w kolano, kiedy od dawien dawna mamy ajaxa.
Poza tym nic nie napisałeś o komunikacji między mikroservisami. Więc pewnie dojdzie Ci jakieś kolejkowanie.

Natomiast jeśli gdziekolwiek będzie dublowal dane, tzn ze nadal troszkę nie ogarniasz po co są mikroserwisy. W Twoim przypadku jeden z nich powinien odpowiadać za autoryzacje i być może za autentykacje, a każdy inny mógłby wtedy z niego korzystać.

0

Generalnie microservice moze zwracac HTML. Chociaz tego zalozenia tez nie lubie. W sumie nie moje, tylko kumpla pomysl.
Komunikacia pomiedzy monolitem i microservicem bedziesz odbywala sie przez SNS i SQS. Jeden bedzie wysylal wiadomosc drugi konsumowal.
JWT bedzie na microservice.

Z duplikacja danych tez dla mnie nie ma totalnie sensu. Tez nie moj, a kumpla z teamu pomysl.
Jak mam potworzone tasks to one sa zapisane do firmy oraz usera. Wydaje mi sie, ze kumpel zla droga idzie. Bo tutaj trzeba potworzyc nowe uuid po stronie microservice. I zapisac je w monolicie.

Najlepiej pewnie, zeby microservice zwracal wylacznie json. Tylko chcemy troche dac nowe UI, bo monolit ma dosc stare UI bootsrap + jquery.

0

Wygląda jakbyś nie potrzebował zupełnie do tego microserwisu.

Weź pod uwagę że żeby coś można być określić mianem "mikroserwis", to to coś musi spełnić pewne konkretne kryteria. Przede wszystkim to znaczy że musi być niezależnie deployowalne i oddzielone od siebie. I nie mam na myśli tutaj że osobno możesz puścić joba na CI, tylko to możesz dowoli zmieniać jedną aplikacje, a druga nadal działa. Dodatkowo to znaczy że nie możesz przetestować tych aplikacji razem przed wdrożeniem, skoro mają być niezależnie deployowalne.

Ten projekt który opisałeś:

poniatowski napisał(a):

Witam, chce stworzyc nowy modul do sysytemu jakim jest task manager. Moze nie taki duzy jaki jira, ale takie podstawowe rzeczy. Task manager chce utworzyc jako microservice z oddzielna baza danych oraz API. Endpointy by zwracaly HTML, czyli np formularz add task czy task list itd. Bede potrzebowal kilka informacji ze strony monolith tj informacje o firmie czy chociazby o uzytkowniku. I teraz troche nie wiem jak to wszysto polaczyc w jedna calosc. Wydaje mi sie, zeby zrobic iframe i dodac to do monolith appki. Zeby uniknac zabawy z CSS/JavaScript etc. Informacje tj fima czy user, chyba bede musial przechowywac w obu bazach danych, monolith i miscroservice. Tylko tutaj jest moje glowne pytanie. Trzymanie tych samych danych w dwoch miejscach to pytanie o klopoty. Nawet z najprostszymi danymi czesto jest problem z sync. To ktos usunie kolumne, ktos inny doda kolumne, czy zmieni walidacje itd itd. Macie moze jakis lepsze pomysly na task manager w miscroservice? Nie wiem czy to w ogole ma sens upychac w taki microservice? I czy ma sense, zeby serwowa HTML?

To nie jest design microserwisu, tylko po prostu nadal wielkiego monolita, tylko że w dwóch procesach. Ale wszystkie wady monolitu nadal są w nich. (tylko jeszcze teraz masz dodatkowy narzut dwóch aplikacji).

Moja rada jest taka żebyś nadal to robił w jednej aplikacji, tylko stosując odpowiednie ograniczenie dwóch części, np korzystając z Dependency Inversion.

0

Fakt. Niby pomysl byl taki, zeby odciazyc glowna baze danych. Ale cos czuje, ze to tak niekoniecznie odciazy w znacznym stopniu.

Z drugiej strony to jak np skalowac taki microservice? W gole nie wiem czy to microservice czy service. Tak troche lipa zrobic np z 1 np 10 instancji task manager. Fakt, cos mi generalnie nie gra. Da rade postawic to na service, ale sam nie widze za duzo koszysci. Do tego ciekawo czy czasem koszty cloud nie pojda w gore przez to.

1
poniatowski napisał(a):

Fakt. Niby pomysl byl taki, zeby odciazyc glowna baze danych. Ale cos czuje, ze to tak niekoniecznie odciazy w znacznym stopniu.

No to przecież możesz mieć dwie bazy danych w jednej aplikacji, nie byłoby w tym nic dziwnego.

Dla przykładu, kod w php:

$first = new PDO("mysql:host=$servername;dbname=first", $username, $password);
$second = new PDO("mysql:host=$servername;dbname=second", $username, $password);
poniatowski napisał(a):

Z drugiej strony to jak np skalowac taki microservice? W gole nie wiem czy to microservice czy service. Tak troche lipa zrobic np z 1 np 10 instancji task manager. Fakt, cos mi generalnie nie gra. Da rade postawic to na service, ale sam nie widze za duzo koszysci. Do tego ciekawo czy czasem koszty cloud nie pojda w gore przez to.

Martwisz się tym wszystkim niepotrzebnie na zapas. Sugeruję YAGNI.

Zrób to wszystko najprościej jak się da, w jednym projekcie. Jeśli faktycznie będziesz miał problemy z wydajnością, że to wtedy się ogarnia taki problem jeśli faktycznie jest. Albo przez instancję, albo przez wydzielenie, albo przez mikroserwisy albo jeszcze inaczej. Ale na razie to zostaw, poczekaj kiedy (albo jeśli)taki problem wystąpi, i wtedy dobrze odpowiednie rozwiązanie, jak będziesz miał więcej informacji.

Na razie dla mnie to jest złamane YAGNI oraz premature optimization.

PS: żeby zrobić prawdziwy mikroserwis to to jest niewyobrażalny koszt czasowy, bardzo duży overhead i w większości projektów się nie opłaca.

0

Kolega, ktory wymyslil ten servic twierdzi, ze chodzi, zeby odciac sie od monolithy app. Na monolicie mamy jakis yii 2 framework, troche legacy php 7.4. I w sumie chcemy cos nowego uzyc symfony + php 8.2 itd. I chyba glownie o to chodzi.

0
poniatowski napisał(a):

Kolega, ktory wymyslil ten servic twierdzi, ze chodzi, zeby odciac sie od monolithy app. Na monolicie mamy jakis yii 2 framework, troche legacy php 7.4. I w sumie chcemy cos nowego uzyc symfony + php 8.2 itd. I chyba glownie o to chodzi.

Pierwszy krok żeby odejść od monolithic app to jest odpowiednie podzielenie aplikacji na moduły. Dopiero jak masz dobre moduły, to możesz te moduły rozbijać na osobne procesy.

Bo smutna prawda jest taka, że jeśli nie umiesz odpowiednio rozbić apki na moduły i wychodzi Ci monolit, to nie będziesz też umiał rozbić kilku microserwisów odpowiednio. Używanie microserwisów nie broni magicznie przed powstaniem monolitów - to nadal będzie monolit, tylko że z interfejsem http a nie obiektów w apce.

0

Wez podaj mi jakis przyklad dobrego miscroservice? Nawet z tym task manager?

0
poniatowski napisał(a):

Wez podaj mi jakis przyklad dobrego miscroservice? Nawet z tym task manager?

Sens microserwisów się pojawia wtedy kiedy masz duży system, który ciężko skalować - tzn musisz dołożyć więcej programistów do projektu, ale oni zaczęliby sobie wchodzić w drogę, więc musisz maksymalnie odseparować te projekty od siebie. Żeby to zrobić, to te projekty nie mogą od siebie zależeń, nie można ich testować razem, deployować razem, w ogóle najlepiej żeby o sobie nic nie wiedziały. Jest to wielkoskalowe przedsięwzięcie.

Po prostu zrób nowy moduł w istniejącej aplikacji, i połącz się z drugą bazą jeśli już koniecznie musisz.

0

Teraz ten sam kolega wymywlil, ze napiszemy task manager jakos microservice, ale bedziemy korzystac z baza danych, ktora jest w monolicie. Czyli wszystkie taski beda zapisywane w monolicie. Tylko logika biznesowa bedzie w serwicie. Czy to nie tworzy pewnego problemu, ze dwie aplikacje beda korzystac z jednej baza danych? Monolit jest na AWS czyli w sumie tam juz sa utworzone prawdopodobinie kilkadziesia polaczen i jest ok. Ale jakos jednak cos mi tutaj nie pasuje.

0
poniatowski napisał(a):

Teraz ten sam kolega wymywlil, ze napiszemy task manager jakos microservice, ale bedziemy korzystac z baza danych, ktora jest w monolicie. Czyli wszystkie taski beda zapisywane w monolicie. Tylko logika biznesowa bedzie w serwicie. Czy to nie tworzy pewnego problemu, ze dwie aplikacje beda korzystac z jednej baza danych? Monolit jest na AWS czyli w sumie tam juz sa utworzone prawdopodobinie kilkadziesia polaczen i jest ok. Ale jakos jednak cos mi tutaj nie pasuje.

Gdyby to był prawdziwy mikroserwisy, i byłby oddzielny to nie tworzy to żadnego problemu.

Ale na 99% to nie będzie mikroserwis tylko po prostu monolit w dwóch procesach, i wtedy to jak najbardziej będzie problem.

0

Tak, teraz to beda dwa molity, korzystajace z tej same bazy danych. Jakie moga byc potencjalne problemy?

0
poniatowski napisał(a):

Tak, teraz to beda dwa molity, korzystajace z tej same bazy danych. Jakie moga byc potencjalne problemy?

No ja bym powiedział że to jest nadal jeden i ten sam monolit.

0

Tak to dalej jest monolit. Chodzi mi jakie moga byc potencjalne problemy z dwoma aplikacjami, ktore korzystaja z jednej bazy danych.

0
poniatowski napisał(a):

Tak to dalej jest monolit. Chodzi mi jakie moga byc potencjalne problemy z dwoma aplikacjami, ktore korzystaja z jednej bazy danych.

Jeśli korzystają z osobnych tabel i widoków, i logują się do bazy osobnymi użytkownikami, to właściwie nie powinno być problemów - bazy danych są zrobione z myślą o rozproszonym dostępie.

Ale jeśli dwie aplikacje dotykają tych samych tabel albo widoków, to właściwie nie ma między nimi enkapsulacji i mogą sobie wejść w drogą, zwłaszcza gdybyś chciał odpalić migracje.

0

Zalozenie tych dwoch aplikacji jest takie, ze beda korzystac z tych samych tabeli. Mozliwe, ze samo migracje beda robione z jednej apki tylko dla tabel tasks. Ale obie apki beda korzystac np z tabel tj user czy company etc.

0

Dla mnie tez to nie ma wiekszego sensu. Kumpel po prostu chce zostawic stary PHPowy framework i napisac task manager w najnowszej wersji Symfony. Niby ok, nowy kod, mozna uzyc najnowszej versji PHP, wzorce projektowe, testy, principles etc etc. Glownie tym sie kierujemy (na to wychodzi). Nie wiem sam czy ma to duzo sensu, ale ok. Nie przetlumacze... Moim zdaniem task manager jest zbyt malutki, zeby budowac nowy service. Troche nie oplaca sie i moze stworzyc wiecej problemow i pozytku, ale nie przetlumacze tego do teamu. Trudno. Dzieki za pomoc mimo wszystko :)

1

Tylko logika biznesowa bedzie w serwicie. Czy to nie tworzy pewnego problemu, ze dwie aplikacje beda korzystac z jednej baza danych?

Zależy kogo pytasz ;)

https://microservices.io/patterns/data/shared-database.html

Forces

  • Services must be loosely coupled so that they can be developed, deployed and scaled independently

  • Some business transactions must enforce invariants that span multiple services. For example, the Place Order use case must verify that a new Order will not exceed the customer’s credit limit. Other business transactions, must update data owned by multiple services.

  • Some business transactions need to query data that is owned by multiple services. For example, the View Available Credit use must query the Customer to find the creditLimit and Orders to calculate the total amount of the open orders.

  • Some queries must join data that is owned by multiple services. For example, finding customers in a particular region and their recent orders requires a join between customers and orders.

  • Databases must sometimes be replicated and sharded in order to scale. See the Scale Cube.

  • Different services have different data storage requirements. For some services, a relational database is the best choice. Other services might need a NoSQL database such as MongoDB, which is good at storing complex, unstructured data, or Neo4J, which is designed to efficiently store and query graph data.

Solution

  • Use a (single) database that is shared by multiple services. Each service freely accesses data owned by other services using local ACID transactions.
0

Zostajemy przy tworzeniu nowego microservisu. Prawdopodobnie jest to po prostu service. W task manager bedziemy tworzyc API, ktore maja zwracac cale widoki (HTML, JS, CSS linki beda w widokach). Niby to sie nazwa Server Side Includes (SSI). Nie mam pojecia czy ma to jakis sens. Chcemy, odciac sie od strego porjektu, ktory jest na PHP 7.4 i zaczac uzywac PHP 8.2. Do tego task manager bedzie na osobnym repo i bedziemy oddzielnie robic deploy czy scaling. Czy ma to sense, zeby te endpointy zwracaly czesc widokow, ktore beda obsadzane do srodka podstron znajdujacych sie na istniejacym monolicie?

0
poniatowski napisał(a):

Zostajemy przy tworzeniu nowego microservisu. Prawdopodobnie jest to po prostu service. W task manager bedziemy tworzyc API, ktore maja zwracac cale widoki (HTML, JS, CSS linki beda w widokach). Niby to sie nazwa Server Side Includes (SSI). Nie mam pojecia czy ma to jakis sens. Chcemy, odciac sie od strego porjektu, ktory jest na PHP 7.4 i zaczac uzywac PHP 8.2. Do tego task manager bedzie na osobnym repo i bedziemy oddzielnie robic deploy czy scaling. Czy ma to sense, zeby te endpointy zwracaly czesc widokow, ktore beda obsadzane do srodka podstron znajdujacych sie na istniejacym monolicie?

Jeśli "stary projekt" jest na PHP 7.4 (który kiedyś też był nowością), jest tak słabo napisany że nie można w nim łatwo wprowadzać zmian; to na 99.99% to samo zrobicie w tym nowym, i wtedy będziecie mieli dwa projekty od których będziecie chcieli się odciąć.

Najlepszym wyjściem byłoby zwiększyć jakoś aktualnego projektu, napisać testy, zrefaktorować go, i po prostu zaktualizować zależności.

0
Riddle napisał(a):
poniatowski napisał(a):

Zostajemy przy tworzeniu nowego microservisu. Prawdopodobnie jest to po prostu service. W task manager bedziemy tworzyc API, ktore maja zwracac cale widoki (HTML, JS, CSS linki beda w widokach). Niby to sie nazwa Server Side Includes (SSI). Nie mam pojecia czy ma to jakis sens. Chcemy, odciac sie od strego porjektu, ktory jest na PHP 7.4 i zaczac uzywac PHP 8.2. Do tego task manager bedzie na osobnym repo i bedziemy oddzielnie robic deploy czy scaling. Czy ma to sense, zeby te endpointy zwracaly czesc widokow, ktore beda obsadzane do srodka podstron znajdujacych sie na istniejacym monolicie?

Jeśli "stary projekt" jest na PHP 7.4 (który kiedyś też był nowością), jest tak słabo napisany że nie można w nim łatwo wprowadzać zmian; to na 99.99% to samo zrobicie w tym nowym, i wtedy będziecie mieli dwa projekty od których będziecie chcieli się odciąć.

Najlepszym wyjściem byłoby zwiększyć jakoś aktualnego projektu, napisać testy, zrefaktorować go, i po prostu zaktualizować zależności.

@Riddle I tak i nie. Do tego tworzymy jeszcze nowy serwis. Dzieki temu mozemy go skalowac osobno, monitorowac czy deployowac osobno. Jezeli bedzie jakis blad po stronie task manager to glowna appka bedzie dalej dzialac tylko bez task managera. Wydaje mi sie, ze jest troche plusow za tym, zeby jednak stworzyc ten serwis.

Druga sprawa jest taka, ze starego monilitu nie da rady tak szybko reanimowac. Nawet nie idzie napisac unit testow, bo kod jest nietestowalny, nie jest napisany w sposob, zeby bylo mozna go przetestowac. Niby teraz piszemy functional i acceptance tests, ale one sa dosc ciezkie...

1

Mam na myśli to, że nowy serwis tworzą Ci sami ludzie którzy tworzyli stary. Spodziewacie się zrobić coś super, ale wyjdzie wam to samo co wcześniej.

0
Riddle napisał(a):

Mam na myśli to, że nowy serwis tworzą Ci sami ludzie którzy tworzyli stary. Spodziewacie się zrobić coś super, ale wyjdzie wam to samo co wcześniej.

Nie, nie. Starta appka jest napisana glownie przez 3 gosci. Zaczeli ta apke 2015 rok. Teraz kazdy z nich ma 40 albo grubo sa po 40tce. Wydaje mi sie, ze oni nie nadazaja juz nad technologia. Teraz firma zatrudnila 3 nowe osoby. Z czego jestem tez ja. I wydaje sie, ze ludzie dosc kumaci. po prostu chcemy zrobic wszytko, zeby juz przestac pisac niskiej jakosc kod. I druga sprawa chcemy zabrac troche tej aplikacji od tych wyjadaczy, zeby nie czuli sie tacy wazni i potrzebni. Bo taka jest prawada.

1
poniatowski napisał(a):
Riddle napisał(a):

Mam na myśli to, że nowy serwis tworzą Ci sami ludzie którzy tworzyli stary. Spodziewacie się zrobić coś super, ale wyjdzie wam to samo co wcześniej.

Nie, nie. Starta appka jest napisana glownie przez 3 gosci. Zaczeli ta apke 2015 rok. Teraz kazdy z nich ma 40 albo grubo sa po 40tce. Wydaje mi sie, ze oni nie nadazaja juz nad technologia. Teraz firma zatrudnila 3 nowe osoby. Z czego jestem tez ja. I wydaje sie, ze ludzie dosc kumaci. po prostu chcemy zrobic wszytko, zeby juz przestac pisac niskiej jakosc kod. I druga sprawa chcemy zabrac troche tej aplikacji od tych wyjadaczy, zeby nie czuli sie tacy wazni i potrzebni. Bo taka jest prawada.

I pomyślałeś że ogromną rewolucja w której tworzycie projekt od nowa to jest dobry pomysł na to? To się na pewno nie uda.

Jeśli na prawdę chciałbyś zacząć pisać dobrej jakości kod, to przede wszystkim musisz wiedzieć jaki kod jest wysokiej jakości a jaki nie. I tutaj przykra informacja: każdy zawsze myśli że jego kod jest wysokiej jakości, nie ważne czy jest tak w istocie czy nie.

Po drugie, takie rewolucje prawie nigdy się nie udają. Żeby zrobić coś takiego musiałbyś mieć bardzo dobrą wiedzę na temat tego jak ten system działa, a z tego co piszesz, to nie masz jej.

To wygląda tak jakby ktoś Ci kazał pisać w aplikacji bardziej starej, Tobie się to nie podoba, ale też nie jesteś w stanie jej jakoś szybko naprawić, więc żeby zminimalizować swoje prywatne cierpienie stwierdzasz że lepiej będzie dla całego produktu jak stworzycie nowy projekt i tam będziecie kontynuować pracę. Tymczasem to jest głównie lepsze dla Ciebie, bo nie musiałbyś poprawiać shitcode'u, co wyjaśnia czemu tak bardzo chcesz to zrobić.

Jeśli chcesz na prawdę zrobić coś co jest dobre dla projektu, to:

  • jeśli masz testy które trwają za długo, powiedzmy dłużej niż 5 minut, to poszukaj sposobów żeby je przyspieszyć
  • jeśli nie ma testów, to napisz jakieś
  • znajdź miejsca w kontroli wersji gdzie jest najwięcej bugów i najwięcej czasu schodzi i spróbuj zrefaktorować albo przepisać to miejsce
  • usprawnij proces deploya, tak żeby wdrożenia trwały krótko i były najbardziej zautomatyzowane jak się da, najlepiej całkiem
  • usprawnij proces wytwarzania oprogramowania , tak żeby jeśli chcesz poprawić literówkę to żeby dało się dodać commit , review I deploy np w ciągu jednego dnia nie powinno być problemem
  • znajdź najczęściej edytowane klasy i refaktoruj je
  • spróbuj zaktualizować stare zależności

To byłby faktyczny wkład w rozwój tego projektu.

Jak zrobisz nowy projekt to tylko skomplikujesz wszystko, bo teraz będą dwa projekty , dwie wersje php, wszystkiego po dwa. Tobie będzie łatwiej pisać w php8 przez chwilę, ale produkt stanie się jeszcze bardziej mniej utrzymywalny niż teraz jest.

0

Jest sporo książek o architekturze mikroserwisowej.
Ze swojej strony spoko wprowadzeniem jest Building Microservices Sama Newmana + od monolitu do mikroserwisow tego samego autora.

Poczytaj z czym się je tę architekturę, jakie problemy stwarza i jakie rozwiązuje bo mocno bladzisz...

1 użytkowników online, w tym zalogowanych: 0, gości: 1