Modularny monolith vs microservices

Modularny monolith vs microservices
B1
  • Rejestracja:prawie 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:51
0

Jakis czas temu doszedlem do wniosku, ze wlasciwie jedyne co mi tak naprawde przeszkadza w monolith'ie to:

  • koniecznosc pull'a calej aplikacji:
    -- wyjatkowo nieoptymalne podejscie przypadku koniecznosci realizacji jakiegos drobnego ficzera lub usuniecia trywialnego bug'a
    -- ryzyko pelnego dostep do partii kodu, ktore mozna okreslic jako "wrazliwe" lub "pufne" dla osob, ktore taki dostep moga potencjalnie wykorzystac w celu niepozadanym
  • problem ilosci zasobow, koniecznych do zaangazowania nawet w przypadku banalnych zapytan.
  • problem skalowalnosci aplikacji

What if...

Budowac monolith skladajacy sie z wyspecjalizowanych modulow, ktore bylyby w stanie funkcjonowac zarowno jako integralne elementy calej aplikacji, jak i niezalezne serwisy? Tego rodzaju podejscie pozwala rozwiazac wymienione wczesniej przeze mnie problemy.

Ostatnio zaczalem sobie cos takiego przygotowywac i zastanawiam sie czy ktos z Was ma za soba jakies doswiadczenia, proby na tym polu.

Zobacz pozostały 1 komentarz
B1
@hipekk: na pewno w twoim przypadku lepiej w ogole sie nie odzywac
szatkus
A co mówi na ten temat Knight?
B1
@szatkus: jakbys sie przykladal do jezykow, sam moglbys go zapytac :D
PaulGilbert
Temat bardziej z zakładki inżynierii oprogramowania niż z zakładki PHP.
B1
@PaulGilbert: Tout à fait possible :D, ale zalezy mi na dyskusji z php'owcami :D
PR
PR
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:204
0

Skoro praca całego systemu jest możliwa jedynie wtedy gdy wszystkie mikroserwisy działają, to faktycznie monolit by się sprawdził. Niemniej modularność przynosi inne bolączki, które uderzą na pewno - ludzie nie potrafią git'a a szczególnie submodułów, po rozwinięciu plugina i tak trzeba go przetestować integracyjnie z resztą systemu, pluginy w DLL są mnie kompatybilne z innymi elementami niż komunikujące się po REST serwisy.

katakrowa
  • Rejestracja:około 10 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Chorzów
  • Postów:1670
0

Po 20 latach pisania aplikacji desktopowych ( typowych monolitów ) i ponad 10 latach pisania aplikacji rozproszonych do postaci różnych API i kilku front-endów czyli generalnie całkowitej odwrotności do aplikacji desktopowej zdecydowanie jestem zwolennikiem tych drugich... ale nie do końca :-)

Za idealne rozwiązanie uważam "hybrydę", w której front end piszemy w cywilizowanym środowisku takim jak Java, Delphi, C# a back-end mamy w postaci API jako serwerowych aplikacji pisanych w PHP, JAVA ( oczywiście same narzędzia mogą być inne w zależności od gustów i upodobań ). To ile czego będzie po której stronie musi być uzasadnione wymogami samej aplikacji i głęboką analizą systemu przed podjęciem działań programistycznych. Nie mam tutaj złotej rady co po której stronie bo czasem nawet lepiej w całości pozostać po jednej.

babel100 napisał(a):

Budowac monolith skladajacy sie z wyspecjalizowanych modulow, ktore bylyby w stanie funkcjonowac zarowno jako integralne elementy calej aplikacji, jak i niezalezne serwisy? Tego rodzaju podejscie pozwala rozwiazac wymienione wczesniej przeze mnie problemy.

Monolit zawsze wymaga bardziej wyspecjalizowanej załogi do pisania. Proste mikroserwisy można zlecać komukolwiek. Bardzo cenne w przypadku gdy realizują mniej istotne dla systemu fragmenty.
Mikroserwisy nie mają ograniczeń technologii jeden możesz napisać w NodeJS drugi w PHP a trzeci w Python. Ściśle pilnować trzeba jedynie spójności komunikacji pomiędzy elementami systemu.


Projektowanie i programowanie. Hobbystycznie elektronika i audio oszołom.
B1
  • Rejestracja:prawie 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:51
0

@pragmaticdev:

Skoro praca całego systemu jest możliwa jedynie wtedy gdy wszystkie mikroserwisy działają,

Nie do konca. Aplikacja zbudowana w sposob o ktorym wspomnialem nie wymaga ani dzialania ani obecnosci wszystkich wymaganych modulow, w przeciwnym przypadku nie porownywalbym tego rozwiazania do mikroserwisow.

ludzie nie potrafią git'a a szczególnie submodułów

a mimo to ujadaja na 4programmers :D

po rozwinięciu plugina i tak trzeba go przetestować integracyjnie z resztą systemu

pelna zgoda

pluginy w DLL są mnie kompatybilne z innymi elementami niż komunikujące się po REST serwisy

Wszystko zalezy od tego w jaki sposob piszesz te pluginy. Jesli piszesz je we wlasciwy sposob, nawet nie myslisz o kompatybilnosci.

B1
  • Rejestracja:prawie 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:51
0

@katakrowa:

Monolit zawsze wymaga bardziej wyspecjalizowanej załogi do pisania. Proste mikroserwisy można zlecać komukolwiek.

Pelna zgodna. Ja jednak pisze o modularnym tworzeniu monolitu w sposob ktory umozliwia wykorzystanie zalet kodu opartego o mikroserwisy.

Mikroserwisy nie mają ograniczeń technologii jeden możesz napisać w NodeJS drugi w PHP a trzeci w Python. Ściśle pilnować trzeba jedynie spójności komunikacji pomiędzy elementami systemu.

Pelna zgoda. Wlasciwie zwrociles uwage na sedno problemu zwiazanego z mikroserwisami. Cala masa projektow rozbija na sile strukture jednorodnej jezykowo aplikacji na mikroserwisy bez jakiegokolwiek uzasadnienia poza tym iz jest to "trendy". Potem okazuje sie ze wyswietlenie aktualnego czasu na stronce wymaga odpalanie kilku-nastu-dziesieciu requestow w tle, a aplikacja bez cache'u nie nadaje sie do uzytku.

PR
PR
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:204
1

Zgodzę się, że dowolność technologii jest zarówno zaletą, ale też poważną wadą. Co prawda i monolity można pisać w różnych technologiach, ale jest to trudniejsze. Uważam, że system powinien być technologicznie spójny, ilość technologi minimalna, a cały zespół powinien mieć kompetencje ich używania.

B1
@pragmaticdev: nie da sie tego lepiej ujac :D
RA
skoro jeden zespół to chyba systemik bo system to może utrzymywać i kilkadziesiąt zespołów i nigdy nie będzie technologicznie spójny jeżeli żyje więcej niż 5 lat a moda zmienia się co roku
B1
@ralf: wlasnie na tym polega problem, ze w dzisiejszych czasach nie tworzy sie juz kodu tylko go adaptuje do kolejnych wersji symfony (lowercase on purpose)
Miang
  • Rejestracja:prawie 7 lat
  • Ostatnio:3 minuty
  • Postów:1659
0
babel100 napisał(a):

Jakis czas temu doszedlem do wniosku, ze wlasciwie jedyne co mi tak naprawde przeszkadza w monolith'ie to:

  • koniecznosc pull'a calej aplikacji:

ale w PHPie? chyba tylko w niektórych frameworkach


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
B1
  • Rejestracja:prawie 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:51
0

@Miang:

ale w PHPie? chyba tylko w niektórych frameworkach

We wszystkich. Jesli sie myle podaj przyklad jednego, ktory nie implikuje tej koniecznosci. Mowie serio, bez ironii i bez podtekstow :)

Zobacz pozostały 1 komentarz
B1
@Miang: smiem twierdzic, ze na 4programmers nikt nie znal i nie zna Slim'a tak dobrze jak ja i zapewniam cie, ze zarowno w przypadku projektu opartego na Slim'ie jak i na kazdym innym frameworku, w momencie kiedy otrzymasz jakiegos taska, zawsze musisz zrobic pull'a calego repo :)
PaulGilbert
smiem twierdzic, ze na 4programmers nikt nie znal i nie zna Slim'a tak dobrze jak ja No proszę - mamy nowego Guru :D
Miang
ja to widocznie jak ci wszyscy wynalazcy co tworzyli coś nie słuchając tych co mówili ze się nie da nie miałam takiego guru wiec nie wiedziałam że całe repo potrzebuję aby jedną rzecz poprawić więc po prostu poprawiałam
O2
@Miang: Jak zmieniasz coś na serwerze od razu to nie dziwne. Jak chcesz pracować na kodzie na prawdę, to musisz go odpalić lokalnie, a więc pobrac z repo. Chyba, że nie macie repo i sobie kod ftpem wysyłacie, ale nikt nie mówi o programowaniu z ery kamienia łupanego.
TR
  • Rejestracja:ponad 7 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:700m n.p.m.
  • Postów:677
0

Mikroserwis, który może działać w trybie REST/standalone, albo trybie aplikacji - gdzie wywołujesz bezpośrednio metody modułu, lub symulujesz RESTowy request http. To pozwala na dużą elastyczność, ale z drugiej strony trzeba się więcej napracować nad modułem.

Jeżeli mikroserwis jest zintegrowany z aplikacją to jego modularność sprowadza się głównie do osobnej przestrzeni nazw plus implementacji jakiegoś interfejsu do komunikacji, gdzie symulujesz REST.


DRY > SOLID (nie bierz tego zbyt poważnie)
edytowany 3x, ostatnio: TomRZ
O2
  • Rejestracja:około 4 lata
  • Ostatnio:4 dni
  • Postów:508
0

Przecież jak chcesz pisać monolit i nie chcesz, żeby cały kod był modyfikowany, to możesz pisać paczki do composera, albo zlecać takowe do napisania, później je zaciągnąć podpiać i hula, nie trzeba aplikacji rozbijać na nie wiadomo co.
Z jsem i webpackiem można tak samo.


sprawiedliwość do sprawiedliwości społecznej ma się tak jak krzesło do krzesła elektrycznego.
edytowany 2x, ostatnio: omenomn2
B1
  • Rejestracja:prawie 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:51
1

@omenomn2: w koncu ktos ogarniety zajarzyl o co chodzi :D.

Chociaz pozostaje Ci jeszcze dodatkowo:

  • kwestia rozwiazania zasobow w taki sposob aby nie byly one ladowane wszystkie (dla kazdej paczki) przy kazdym request'ie
  • kwestia swobody podpinania/odpinania paczki do paczki, paczki do grupy paczek, paczki do aplikacji, grup paczek do aplikacji - i nie chodzi tu o proste uzycie composera bo caly czas mamy do czynienia z ekonomika gospodarowania zasobami
  • kwestia funkcjonowania paczki/grupy paczek rowniez jako osobyny serwis w razie potrzeby

Dokladnie tym sie bawie ale na 357 wejsc w tej chwili tylko ty zajarzyles "o czym ja w ogole rozmawiam" :D

edytowany 1x, ostatnio: babel100
B1
  • Rejestracja:prawie 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:51
0

@TomRZ:

Jeżeli mikroserwis jest zintegrowany z aplikacją to jego modularność sprowadza się głównie do osobnej przestrzeni nazw plus implementacji jakiegoś interfejsu do komunikacji, gdzie symulujesz REST

No nie do konca. Paczka/modul ktora jest zarowno integrowalna w wiekszej grupie paczek lub calej aplikacji, i kazdy z tych poziomow integracji paczka/grupa/aplikacjia ma wymagalna umiejetnosc funkcjonowania rowniez w sposob samodzielny zarowno jako REST'owy client i endpoint lub modul aplikacji wymaga odrobiny wiecej wyrafinowania :D. Tutaj nie ma miejsca na symulowanie czegokolwiek zwlaszcza jesli masz na uwadze swobodna skalowalnosc. Dodaj do tego unikalny zestaw (routing, konifiguracja, middleware, views etc) dla kazdej paczki/grupy paczek i zabawa staje sie coraz bardziej skomplkowana w momencie kiedy celem jest angazowanie tylko tego co niezbedne w danej chwili, a nie tego co zawiera config/routing etc calej aplikacji.

edytowany 3x, ostatnio: babel100
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około godziny
0
babel100 napisał(a):

Pelna zgoda. Wlasciwie zwrociles uwage na sedno problemu zwiazanego z mikroserwisami. Cala masa projektow rozbija na sile strukture jednorodnej jezykowo aplikacji na mikroserwisy bez jakiegokolwiek uzasadnienia poza tym iz jest to "trendy". Potem okazuje sie ze wyswietlenie aktualnego czasu na stronce wymaga odpalanie kilku-nastu-dziesieciu requestow w tle, a aplikacja bez cache'u nie nadaje sie do uzytku.

Może dlatego, że ktoś próbuje na siłę przenieść wzorce z monolitu na mikroserwisy. To, że w monolicie odpytanie o aktualny czas wymaga przebicia się przez 15 warstw abstrakcji nie oznacza, że po zamianie na mikroserwisy trzeba odpytywać łańcuch 15 mikroserwisów. My mamy mikroserwisy i w znakomitej większości przypadków jest tak, że jeśli serwis A potrzebuje danych z serwisu B, to serwis A łączy się bezpośrednio do serwisu B. Głównym wyjątkiem jest fasada dla frontendu, która upraszcza (oraz ujednolica, przyspiesza, lepiej monitoruje, itp itd) zapytania idące z frontendu do backendu.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
O2
  • Rejestracja:około 4 lata
  • Ostatnio:4 dni
  • Postów:508
0

kwestia swobody podpinania/odpinania paczki do paczki, paczki do grupy paczek, paczki do aplikacji, grup paczek do aplikacji - i nie chodzi tu o proste uzycie composera bo caly czas mamy do czynienia z ekonomika gospodarowania zasobami

Jak robisz paczke dla composera to tak samo możesz podpinać zależności, więc możesz zrobić załóżmy paczkę "Panel Admina" i mieć tam inna paczkę np. "Jwt token" i używać jej jednocześnie w "Panel Admina" jak i bezpośrednio w głównej apce.

Dokladnie tym sie bawie ale na 357 wejsc w tej chwili tylko ty zajarzyles "o czym ja w ogole rozmawiam" :D

Spoko ;)


sprawiedliwość do sprawiedliwości społecznej ma się tak jak krzesło do krzesła elektrycznego.
B1
  • Rejestracja:prawie 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:51
0

@omenomn2: zeby wrocic do meritum, w jaki sposob/w ktorym miejscu ladujesz konfiguracje paczek odpalajac aplikacje ? :D

O2
Zobacz sobie jak w Laravelu to jest zrobione. Jak robisz paczkę dla Laravela, to później publikujesz pliki configuracyjne do folderu config i tam sobie ustawiasz co potrzebujesz, lub nie publikujesz i działasz na ustawieniach defaultowych. Z tym, że nie możesz mieć np. dwóch konfiguracji paczki w jednym projekcie, tzn nigdy tak nie robiłem.
B1
@omenomn2: niewazne czy to symfony laravel, jesli potrzebujesz jakiegos config'a, middleware, dependencies dla jednej paczki, zawsze rownolegle ladujesz podobne elementy dla calej aplikacji (chociaz w przypadku middleware w laravel'u nie jestem pewien). Idea jest taka zeby w momencie "uruchomienia" paczki ladowac tylko i wylacznie to co jest potrzebne paczce, niezaleznie od tego czy ta paczka jest pojedynczym mikroserwisem, paczka w grupie paczek bedacych jako calosc mikroserwisem czy tez paczka w aplikacji monolicie.
B1
@omenomn2: osiagniecie czegos takiego nie jest wcale takie oczywiste. W symfony np w odniesieniu do middleware pewien pakiet jest zawsze odpalany na sztywno i nie masz na to wplywu, w laravel'u - nie wiem, bo nie znam, ale przypuszczam ze podobnie.
B1
  • Rejestracja:prawie 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:51
0

@Wibowit: sorry za wczesniejszy wpis, pelna zgoda.

edytowany 2x, ostatnio: babel100
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)