Kod statusów, mikroserwisy

0

Jest taka przykładowa sytuacja:
Klient pyta mikroserwis A o dostępność jakiejś płyty w naszym sklepie, mikroserwis A pyta z jakiegoś powodu mikroserwis B o to, czy posiadamy danego autora w naszym systemie. Mikroserwis B zwraca kod 404, bo takiego autora nie posiadamy. W takim przypadku dla klienta z mikroserwisu A mamy zwrócić również kod 404(czyli przekazać ten który nam przyszedł z mikroserwisu B), czy przemapować to na kod 5xx czy jakiś inny?

Chodzi o to, że klient pyta stricte o samą płyte, a mikroserwis B nam zwraca info o autorze do dalszej logiki która nam jest niezbędna do dalszego procesowania

Co w przypadku gdy takich sytuacji mamy więcej? Np. 20 mikroserwisów, który każdy z nich może mieć taką zależność
Jak Wy to u siebie robicie? Jakieś patterny, biblioteki do tego?

1

Jezeli 20 mikroserwisow ma od siebie zaleznosc, to SLA takiego rozwiazania jest barszo niskie i cos poszlo nie tak.

Nie rozumiem, dlaczego A pyta B o autora, kiedy sprawdzasz plyte - na oko wyglada to na osobny bounded context.

Do takich odczytów raczej budujesz readmodel i chcesz miec wszystkie dane dostepne u siebie, a nie dociagac z wielu miejsc. A jezeli juz dociagac, to musisz obslyzyc partial result, jesli jakis serwis sie wylozy.

Odnosnie kodow bledu - zalezy czy to jest „blad klienta” (4xx) czy „blad serwera” (5xx) i czy jest mozliwosc ponowienia requesta (5xx).

0

Z tym autorem to taki prymitywny przykład, że po prostu pytam o jakąś istotną dane z innego mikroserwisu

Tutaj mam sytuacje, że czasem musze dociągnąć jakieś dane z innego mikroserwisu, bo te dane się zmieniają i musze mieć aktualne.

Ale chodzi mi o to o co klienta pyta, a z jakiego powodu kod błędu jest rzucany.
Bo przykładowo jeśli mikroserwis B rzuca mi 404, dlatego że takiego autora nie ma. To w mikroserwisie A też powinienem rzucić 404 dla klienta, mimo że klient pytał o płyte, a nie autora? Czy w takiej sytuacje nie powinienem zmapować kodu 404 na np. 5xx ?
Przyjmijmy że autor jest pobierany dla procesowania jakiejś dalszej logiki

1

zależy czym ta sytuacja jest z punktu widzenia mikroserwisu A - to juz trzeba biznesu pytać jak mamy zareagować w tym konkretnym przypadku bo każda reakcja może być rownie dobra, np:

a) Klient pyta o obliczenie jego marż dla konta PREMIUUM - my odpytujemy o konfig kont PREMIUUM mikroserwis B, żeby to wyliczyć, okazuję się że konto PREMIUUM jest nieznane w systemie (mamy tylko PREMIUM, czyli literówka się wkradła) - wtedy pownniśmy zwracać jakieś kody z 4xx bo błąd jest po stronie klienta.

b) nasz mikroserwis odkłada jakieś metadane dotyczące transakcji klienta, niech to będą same ID - prosi nas pewnego razu o wygenerowanie wyciągu transakcji z 5 lat przed. Odpytujemy mikroserwis B (jakiś na dane archiwalne) o szczegółowe dane dla zadanych ID - mikroserwis B zwraca 404 - i tutaj powinniśmy potraktować to jako błąd - bo nie możliwa z punktu widzenia systemu jest sytuacja w której znikneły nam archiwalne faktury / coś sie rozsynchronizowało

c) Obliczamy oferte dla klienta - odpytujemy mikroserwis B o promocje aktywne dla grupy w której jest klient - zwraca 404. Wtedy ustawiamy wartość domyślną (brak promocji) obliczamy co trzeba i zwracamy normalnie 200.

Więc mamy tą samą sytuację (mikroserwis B zwraca 404) a 3 różne zachowania. W normalnej sytuacji to będzie opisane w zadaniu, jak należy się zachować / dopytać analizy lub biznesu bo to nie jest w kompetencji developera (chyba że case jest oczywisty)

Tutaj @Charles_Ray ma dużo racji, takie dylematy najczęściej wynikają ze złej architektury - jakby był model push i mikroserwis B pushowałby na szyne zmiany dotyczące autora, to wystarczyłoby zaaktualizować cache / storage mikroserwisu A i problem nie istnieje w ogóle, ale to tyle z teorii. W praktyce nie robimy rewolucji architektury 10 letniego systemu tylko kombinujemy jak to pożenić żeby działało.

0

Klienta nie interesuje, co jest pod spodem i ile mikroserwisów bierze udział w zapytaniu. Gdyby autor był w bazie danych, a nie w zewnętrznym serwisie, to co byś zwrócił w przypadku błędu odczytu? To raczej 500, ale może da się to zamarkować jakimś polem authorDataMissing. Na pewno nie proxuj na pałę statusów z jednego serwisu do drugiego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1