Duży transfer plików / danych w architekturze Microservice

22

Moja firma pracuje obecnie nad przyjęciem architektury mikrousług, ale po drodze napotykamy na coraz większy ból (szok!). Jednym z kluczowych punktów spornych, przed którymi stoimy, jest sposób przesyłania dużych ilości danych między naszymi różnymi usługami.

Jako odrobinę tła mamy magazyn dokumentów, który służy jako repozytorium każdego dokumentu, który może być potrzebny w całej firmie. Interakcja ze wspomnianym sklepem odbywa się za pośrednictwem usługi, która zapewnia klientowi unikalny identyfikator i lokalizację do strumieniowego przesyłania dokumentu. Do lokalizacji dokumentu można później uzyskać dostęp za pomocą podanego identyfikatora.

Problem w tym, że - czy ma sens, aby wszystkie nasze mikrousługi akceptowały ten unikalny identyfikator jako część interfejsu API w celu interakcji z dokumentami, czy nie? Dla mnie jest to z natury niewłaściwe - usługi nie są już niezależne i polegają na usługach magazynu dokumentów. Przyznaję, że może to uprościć projektowanie interfejsu API i być może nawet zwiększyć wydajność wynikowego sprzężenia więcej niż zrównoważyć korzyści.

Czy ktoś wie, jak tęczowe jednorożce (Netflix, Amazon, Google itp.) Obsługują duże pliki / wymianę danych między swoimi usługami?

PremiumTier
źródło
Czego używasz do wysoce dostępnego magazynu dokumentów / plików?
Terence Johnson,
@TerenceJohnson Na razie korzystamy z domowego rozwiązania. Przechodzimy na rozwiązanie, które wykorzystuje interfejs API RESTful, który zachowuje tylko unikalny identyfikator dokumentu i jego lokalizację (który jest dostarczany klientowi, a nie strumieniowi, aby zapobiec niepotrzebnemu obciążeniu sieci wewnętrznej). Rzeczywista trwałość zostanie wykonana za pośrednictwem AWS.
PremiumTier

Odpowiedzi:

7

Czy ktoś wie, jak tęczowe jednorożce (Netflix, Amazon, Google itp.) Obsługują duże pliki / wymianę danych między swoimi usługami?

Niestety nie wiem, jak sobie radzą z takimi problemami.

Problem w tym, że - czy ma sens, aby wszystkie nasze mikrousługi akceptowały ten unikalny identyfikator jako część interfejsu API w celu interakcji z dokumentami, czy nie?

Narusza to zasadę pojedynczej odpowiedzialności, która powinna być nieodłącznie związana z architekturą mikrousług. Jedna mikrousługa - logicznie jedna, fizycznie wiele reprezentujących ją instancji - powinna zajmować się jednym tematem .

W przypadku magazynu dokumentów masz jeden punkt, w którym przechodzą wszystkie zapytania dotyczące dokumentów (oczywiście możesz podzielić tę jednostkę logiczną na wiele magazynów dokumentów dla kilku rodzajów dokumentów).

  • Jeśli „aplikacja” musi pracować na dokumencie, pyta odpowiednią mikrousługę i przetwarza jej wynik (y).

  • Jeśli inna usługa potrzebuje rzeczywistego dokumentu lub jego części, musi poprosić o obsługę dokumentów.

Jednym z kluczowych punktów spornych, przed którymi stoimy, jest sposób komunikowania dużych ilości danych między naszymi różnymi usługami.

To jest problem architektoniczny:

  1. Zmniejsz potrzebę przesyłania dużych ilości danych

    Idealnie byłoby, gdyby każda usługa zawierała wszystkie swoje dane i nie wymaga przesyłania, aby obsłużyć żądania. Jako rozszerzenie tego pomysłu - jeśli potrzebujesz transferu danych, pomyśl o redundancji (* w pozytywny sposób_): Czy sensowne jest, aby dane były redundantne w wielu miejscach (tam, gdzie są potrzebne)? Pomyśl, w jaki sposób ewentualne niespójności mogą zaszkodzić twoim procesom. Nie ma szybszego transferu, ponieważ w rzeczywistości żaden .

  2. Zmniejsz rozmiar samych danych

    Pomyśl o tym, jak możesz skompresować swoje dane: od rzeczywistych algorytmów kompresji po inteligentne struktury danych . Im mniej przechodzi przez przewód, tym szybciej jesteś.

Thomas Junk
źródło
2

Jeśli identyfikator zwrócony przez swojego sklepu dokumentu jest sposób do dokumentów referencyjnych w całym systemie, to ma sens dla wszystkich usług przyjąć, że „dokument id” na ich API, gdy wymaga naprawy, aby wiedzieć, które dokumentują to musi pracować.

Niekoniecznie tworzy to ściślejsze powiązanie między usługami, niż jest to konieczne. Usługi, które muszą uzyskać dostęp do dokumentów, muszą mimo to uzyskać dostęp do usługi przechowywania dokumentów i potrzebują tego identyfikatora, aby poinformować sklep, do którego dokumentu mają uzyskać dostęp.
Usługi, które nie mają bezpośredniego dostępu do dokumentów, mogą wymagać przekazania identyfikatora dokumentu, ale dla tych usług byłby to tylko dowolny ciąg znaków, który nie tworzy zależności.

Bart van Ingen Schenau
źródło
Dziękuję za odpowiedź. Powinienem dodać, że potencjalnie moglibyśmy skorzystać z udostępnienia naszych mikrousług zewnętrznym konsumentom, którzy mogą nie chcieć również wykorzystywać naszego wewnętrznego magazynu dokumentów. Mając to na uwadze, czy nadal uważasz, że to najlepsze podejście?
PremiumTier
@PremiumTier: Tak. Ale ci klienci zewnętrzni musieliby zapewnić własny sklep, który obsługuje ten sam interfejs API co sklep wewnętrzny, aby Twoje usługi mogły z nim współpracować.
Bart van Ingen Schenau
Ma to sens, ale nadal wydaje się bardziej kłopotliwe niż usługi akceptujące strumienie, tablice bajtów lub obiekty BLOB JSON zamiast odniesień do dokumentów. W takim przypadku można łatwo wywołać usługę „adaptera”, aby w razie potrzeby uzyskać strumień plików przed wywołaniem kolejnych usług. Nawiasem mówiąc, nie próbuję argumentować, ale po prostu próbuję zrozumieć zalety tego podejścia :)
PremiumTier
2

Osobiście wolałbym nie używać oddzielnej usługi przechowywania dokumentów i identyfikatora dokumentu, ale adres URL w celu uzyskania dostępu do dokumentów (z odpowiednim uwierzytelnieniem nagłówka). Dzięki takiemu podejściu nie będziesz potrzebować innych usług, aby polegać na usłudze dokumentów, a może po prostu użyć pełnego adresu URL, aby uzyskać dostęp do dokumentu, a także ma sens, jeśli chodzi o skalowanie, możesz użyć wielu magazynów dokumentów jako i gdy pamięć wzrośnie i podaj adres URL.

Jednak możesz potrzebować usług, aby przesłać dokument i uzyskać jego adres URL.

Nisko latający pelikan
źródło
1

Czy ktoś wie, jak tęczowe jednorożce (Netflix, Amazon, Google itp.) Obsługują duże pliki / wymianę danych między swoimi usługami?

Zapoznaj się ze specyfikacjami interfejsu API REST Amazon S3, najwyraźniej zwracają pełny obiekt w bajtach. Nie wydaje się wiele opcji, jeśli projektujesz mikrousługę. Link do formatu odpowiedzi Amazon S3

suresh
źródło