Mikrousługi i łączenie baz danych


112

Dla osób, które dzielą aplikacje monolityczne na mikrousługi, jak radzisz sobie z problemem rozbijania bazy danych. Typowe aplikacje, nad którymi pracowałem, często integrują bazy danych ze względu na wydajność i prostotę.

Jeśli masz dwie tabele, które są logicznie różne (ograniczone konteksty, jeśli wolisz), ale często wykonujesz zagregowane przetwarzanie dużych ilości tych danych, to w monolicie jest bardziej niż prawdopodobne, że unikniesz orientacji obiektowej i zamiast tego używasz standardu bazy danych JOIN, aby przetworzyć dane w bazie danych przed zwróceniem zagregowanego widoku z powrotem do warstwy aplikacji.

Jak uzasadniasz podział takich danych na mikrousługi, w przypadku których prawdopodobnie będziesz musiał „połączyć” dane za pośrednictwem interfejsu API, a nie w bazie danych.

Przeczytałem książkę Sama Newmana o mikrousługach, a w rozdziale o dzieleniu Monolitu podaje on przykład „Zerwania relacji klucza obcego”, w którym przyznaje, że łączenie w interfejsie API będzie wolniejsze - ale mówi dalej, czy Twoja aplikacja i tak jest wystarczająco szybka, czy ma znaczenie, że jest wolniejsza niż wcześniej?

Wydaje się to trochę bezmyślne? Jakie są doświadczenia ludzi? Jakich technik użyłeś, aby połączenia API działały poprawnie?


2
Dobre pytanie, mam ten sam problem i skończyło się na tym, że mam zmaterializowany widok i przyłączam się do niego. Nie podoba mi się to, ale myślę, że będzie to wyzwanie dla Micro Services. Nie ma na to właściwego sposobu, jest to po prostu wybór projektu. Wiem, że wiele osób twierdzi, że możemy mieć zmaterializowany pogląd, ale zagregowane odpowiedzi stają się problemem. Daj mi znać, jeśli znalazłeś coś lepszego.
PavanSandeep

Wiem, że to jest stare, ale czy jest to coś, co rozwiązuje Graphql? Przyglądam się temu również w przypadku migracji podzielonej na segmenty i wydaje się, że Graphql jest sposobem na to, aby to zrobić bezproblemowo.
themightybun

W pewnym momencie powinieneś zdać sobie sprawę, że bycie dogmatycznym nie jest właściwą drogą. GraphQL jest przyzwoitym przykładem wykonywania agregacji poza źródłem danych i zwykle działa dobrze.
Christian Ivicevic

Odpowiedzi:


26
  • Kiedy wydajność lub opóźnienie nie mają większego znaczenia (tak, nie zawsze ich potrzebujemy), jest całkowicie w porządku, aby po prostu użyć prostych interfejsów API RESTful do odpytywania dodatkowych danych, których potrzebujesz. Jeśli musisz wykonać wiele wywołań różnych mikrousług i zwrócić jeden wynik, możesz użyć wzorca API Gateway .

  • Nadmiarowość w środowiskach trwałości Polyglot jest w porządku . Na przykład możesz użyć kolejki wiadomości dla swoich mikrousług i wysyłać zdarzenia „aktualizacji” za każdym razem, gdy coś zmienisz. Inne mikrousługi nasłuchują wymaganych zdarzeń i lokalnie zapisują dane. Dlatego zamiast przesyłać zapytania, wszystkie wymagane dane są przechowywane w odpowiednim magazynie dla określonej mikrousługi.

  • Nie zapomnij też o cachowaniu :) Możesz użyć narzędzi takich jak Redis lub Memcached, aby uniknąć zbyt częstego przeszukiwania innych baz danych.


25
Wszystkie dobre sugestie, ale nadal trudno mi to zracjonalizować. Może to dlatego, że jesteśmy przyzwyczajeni do wykonywania wielu operacji w bazie danych. Nasza obecna aplikacja ma skomplikowane procedury składowane, które przetwarzają duże ilości danych, a następnie zwracają niewielki zestaw wyników. W architekturze mikrousług uważam, że te jednostki powinny być podzielone na różne ograniczone konteksty. Wiemy, że obecne podejście jest brzydkie, ale trudno jest uzasadnić przeniesienie wszystkich danych z powrotem do warstwy aplikacji w celu ich przetworzenia. Może pomogłaby większa denormalizacja lub wstępne obliczenie zagregowanych widoków.
Martin Bayly

1
Tak, widzę. Podejście mikrousług nie jest dla wszystkich i należy je ostrożnie stosować. Prawdopodobnie możesz zacząć od mniejszych zmian.
sap1ens

Prawdopodobnie programiści StackExchange byliby lepszym miejscem do zadawania tego pytania: programmers.stackexchange.com/questions/279409/ ... i inne pytania otagowane mikrousługi programmers.stackexchange.com/questions/tagged/microservices
Martin Bayly

9

Usługi mogą mieć replikowane kopie tylko do odczytu niektórych danych referencyjnych z innych usług.

Biorąc pod uwagę, że podczas próby refaktoryzacji monolitycznej bazy danych na mikrousługi (w przeciwieństwie do przepisywania)

  • utwórz schemat bazy danych dla usługi
  • utwórz wersjonowane * widoki ** w tym schemacie, aby udostępnić dane z tego schematu innym usługom
  • czy łączy się z tymi widokami tylko do odczytu

Umożliwi to niezależne modyfikowanie danych / struktury tabeli bez przerywania pracy innych aplikacji.

Zamiast używać widoków, mógłbym również rozważyć użycie wyzwalaczy do replikacji danych z jednego schematu do drugiego.

Byłby to stopniowy postęp we właściwym kierunku, ustalenie połączeń komponentów, a przejście do REST można wykonać później.

* widoki można rozszerzyć. Jeśli wymagana jest istotna zmiana, utwórz wersję 2 tego samego widoku i usuń starą wersję, gdy nie jest już wymagana. ** lub funkcje o wartościach tabelarycznych lub Sprocs.


5

CQRS --- wzorzec agregacji zapytań komend jest odpowiedzią na to pytanie według Chrisa Richardsona. Niech każda mikrousługa zaktualizuje swój własny model danych i wygeneruje zdarzenia, które zaktualizują zmaterializowany widok z wymaganymi danymi sprzężenia z wcześniejszych mikrousług.To MV może być dowolną bazą danych NoSql lub Redis lub elastyczną wyszukiwarką zoptymalizowaną pod kątem zapytań. Technika ta prowadzi do ostatecznej spójności, która zdecydowanie nie jest zła i pozwala uniknąć łączenia w czasie rzeczywistym po stronie aplikacji. Mam nadzieję, że to odpowiada.


2

Oddzieliłbym rozwiązania ze względu na obszar użytkowania, powiedzmy operacyjne i raportowe.

W przypadku mikrousług, które działają w celu dostarczania danych dla pojedynczych formularzy, które wymagają danych z innych mikrousług (jest to przypadek operacyjny), myślę, że najlepszym rozwiązaniem jest użycie sprzężeń API. Nie pójdziesz na duże ilości danych, możesz dokonać integracji danych w serwisie.

Drugi przypadek to sytuacja, w której musisz wykonać duże zapytania na dużej ilości danych, aby przeprowadzić agregacje itp. (Przypadek raportowania). W tym celu pomyślałbym o utrzymaniu udostępnionej bazy danych - podobnej do twojego oryginalnego schematu i aktualizowaniu jej zdarzeniami z baz danych mikrousług. W tej współużytkowanej bazie danych można nadal korzystać z procedur składowanych, co pozwoli zaoszczędzić wysiłek i wspomoże optymalizacje bazy danych.


1

W mikrousługach tworzysz diff. czytaj modele, więc na przykład: jeśli masz dwa różnice. ograniczony kontekst i ktoś chce wyszukiwać w obu danych, wtedy ktoś musi nasłuchiwać zdarzeń z obu ograniczonych kontekstów i utworzyć widok specyficzny dla aplikacji.

W tym przypadku potrzeba więcej miejsca, ale nie będą potrzebne żadne łączenia ani łączenia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.