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?
źródło
Odpowiedzi:
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.
źródło
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)
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.
źródło
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.
źródło
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.
źródło
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.
źródło