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?
źródło
Odpowiedzi:
Niestety nie wiem, jak sobie radzą z takimi problemami.
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.
To jest problem architektoniczny:
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 .
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ś.
źródło
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.
źródło
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.
źródło
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
źródło