Wpis z mikrobloga

Aplikacja Y komunikuje się po REST API z klientem X. Metryką jest tutaj poprawne działanie, a nie jego szybkość przetworzenia.

Po stronie klienta X stoi stary serwis, który może obsłużyć tylko jedno żądanie jednocześnie - w przeciwnym wypadku rzuca błędem. Klienta nie można zmienić.

Aplikacja Y wykonuje logikę biznesową w puli wątków i wywołuje usługę X.

Aby ograniczyć błędy po stronie aplikacji Y najlepiej zrobić?
1. W logice biznesowej wyodrebnić osobny pojedyńczy wątek - służylby on tylko do wywoływania usługi, kiedy by odpowiedziała brałby nowe zadanie. Zadania kolejkowałby się na LinkedBlockingQueue.

2. ?

#naukaprogramowania #java #programowanie
  • 8
@quwer: wg mnie jest obawa, że przy odpowiednio dużej ilości zapytań skończy się pula wątków które będą czekać na odpowiedź. Nie wiem jaki jest czas odpowiedzi, ale jeśli np. aplikacja Y w minutę dostanie 300 zapytań które muszą wywołać serwis X który odpowiada dłużej niż 200ms to wszystko stanie.

Można zapisywać te żądania do kolejki na bazie danych, które jakiś niezależny serwis by obsługiwał. Pozostaje kwestia wyświetlenia wyników zapytania i powiadomienia,
@quwer:
1. Kolejkujesz requesty
2. Używasz funkcji która napiszesz w stylu "await-until-something-is-done" aż z pierwszego requestu dostaniesz to co chcesz np. kod 200 i wtedy przechodzisz do kolejnego requestu w kolejce jeżeli funkcja zwróciła true, dodatkowo możesz ustawić timeout
3. Jeżeli wszystkie requestu spełniły pożądany rezultat, np na wszystkie była odpowiedź 200 to jest git. Wyniki możesz sobie nawet zapisać w liście (baza, hashmapa, jeden #!$%@?) z każdego requestu.

ps. jestem
@quwer: ja korzystam ze zwykłych kolekcji Javowywch typu to co wymieniłes, zależy ile tego masz tak naprawdę, bo można to zrobić in memory albo z całą obsługa używając rabbita który chyba ma taką opcję out of the box z tego co mi się wydaje
@quwer: na razie zrób najprościej jak się da byleby mieć funkcjonalność, potem ja przetestuj, potem pomyśl nad tym jak to ogarnąć jeżeli byłoby tych requestow po kilkanascie tysi koła na przykład czy coś
@quwer: najlepiej napisać osobną małą apkę, która będzie proxy dla tego starego serwisu. To ta apka będzie ograniczała ruch. Twój sposób jest ok, ale są dwie wady: tą logikę jak już wspomniałem można fajnie wyodrębnić do innego serwisu. Druga wada: co się stanie jak odpalisz dwie aplikacje Y ( ͡° ͜ʖ ͡°)