Przeszukiwanie danych w kilku mikrousługach

13

Mam dane dla pewnej domeny rozproszonej między mikrousługą a starszą bazą danych. Mam wyszukiwanie, które obejmuje pola zarówno w starszej, jak i mikrousługowej bazie danych. Poprzednio (przed podziałem mikrousług) było to wykonywane przy użyciu 1 zapytania SQL. Teraz potrzebuję wywołania REST i zapytania do starszej bazy danych, aby obsłużyć tę funkcję wyszukiwania. Mówimy tutaj o kilku milionach wierszy. Jak mogę to najlepiej wymodelować? Z powodu dużej ilości danych wywołanie REST zwykle zwraca również wyniki paginacji. Naiwne podejście do wywoływania wywołania SQL oraz łączenia i scalania wyników z odpowiedzią REST jest zbyt powolne i mało praktyczne.

senseiwu
źródło

Odpowiedzi:

21

Funkcję wyszukiwania można modelować jako oddzielną usługę z oddzielną odpowiedzialnością od dwóch wspomnianych usług. Tak więc podejściem może być stworzenie nowej usługi („wyszukiwanie”) i przechowywanie kopii danych z obu usług w formie, która jest łatwa do indeksowania i wyszukiwania, być może również zdenormalizowana w celu szybkiego uzyskania wyników w żądany format.

Tak więc, na przykład, możesz mieć starszą bazę danych SQL, używając np. MySql, inną mikrousługę, np. MongoDB, i nową usługę wyszukiwania, korzystając z elasticsearch z danymi z obu już wklejonych (zdormalizowanych) dla wygodniejszego dostępu. oczywiście szczegóły będą zależeć od rodzaju wyszukiwań, które należy przeprowadzić.

Dane z dwóch usług najlepiej byłoby przenieść asynchronicznie do indeksu wyszukiwania za pośrednictwem magistrali zdarzeń, takiej jak Kafka lub Hermes, w celu zwiększenia przepustowości i zmniejszenia sprzężenia między usługami. Zmiana dowolnej z dwóch usług spowodowałaby wysłanie zdarzenia informującego usługę wyszukiwania o aktualizacji również jej danych.

Oczywiście istnieje koszt dodatkowego opóźnienia między zmianami usług i usługi wyszukiwania, ale ponieważ mikrousług są zwykle używane w systemach, które są rozproszone, pewne opóźnienia i przejściowe niespójności są nieuniknione. Posiadanie dodatkowej usługi i wykorzystanie dodatkowej pamięci dla kopii danych, która jest już w pozostałych dwóch usługach, jest również typowym kosztem posiadania wysoce rozproszonego i skalowalnego systemu wykorzystującego mikrousługi.

Michał Kosmulski
źródło
Już myślałem o stworzeniu oddzielnej usługi. Jedyne, co sprawia mi pewien dyskomfort - tworzenie kolejnej bazy danych tylko do wyszukiwania (kolejna opcja to karmienie jej elastyczną opcją, ale mamy pewne wąskie gardła w infrastrukturze)
senseiwu
7
@zencv Niestety mikrousługi wiążą się z takimi kosztami. Możliwość skalowania w poziomie oznacza, że ​​sprzężenie musi być słabe, a to oznacza, że ​​często dochodzi do powielania danych. Zyskujesz także znacznie większy ruch w sieci. Skalowalność często oznacza spadek wydajności na jednostkę sprzętową i wybranie jednej architektury nad drugą (np. Mikrousługi zamiast monolitu) musi uwzględniać ten kompromis.
Michał Kosmulski