Długi czas odpowiedzi z serwera (po HTTP)

Długi czas odpowiedzi z serwera (po HTTP)
PL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
0

Hej,
Mam taki usecase że stukam z aplikacji po HTTP po dane, które się długo mielą. Czekam po 4-5, czasem 6 sekund na response.
Możecie doradzić jak to usprawnić by nie zajechać aplikacji? Boję się że w obecnym przypadku - gdy kilkudziesięciu klientów odpali tą funkcjonalność to wszystkie wątki w mojej spring bootowej aplikacji będą zajęte oczekiwaniem na response.

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
0

przyśpieszyć "mielenie" danych. Nie bardzo wiem gdzie "stukasz" - do własnego serwisu czy do cudzego? Jak do cudzego to co byś chciał zmienić, żeby było szybciej?

CountZero
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 263
0

@platinium: Zrób te zapytanie HTTP asynchronicznie.

PI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2787
2

A za co dokładnie odpowiada ten cudzy serwis? Może nieoptymalnie korzystasz z jego API?

CountZero
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 263
0

@abrakadaber Zakładam że robi zapytanie do serwisu -> mapuje odpowiedź na inną -> zwraca odpowiedz.

Jeśli tak to niech OP popatrzy na to - https://blog.davidvassallo.me/2019/11/04/speeding-up-spring-mvc-with-completablefuture/ . Jak nie chcesz zajechać aplikacji a nie zależy ci na performancie, to zdefiniuj własny thread pool z ograniczoną ilością wątków i używaj tylko jego do wywoływania tych restów.

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
0

@CountZero: mi się wydaje, że to co pisze pytacz to jakiś middleware (ma jeszcze jakichś klientów). W tym kontekście Twoja ostatni odpowiedz może być rozwiązaniem, które nie spowoduje skończenia się zasobów - coś jak telefoniczne "jesteś 1634 w kolejce, proszę czekać". Jednak nie zmienia to faktu, że czas odpowiedzi będzie tylko rósł... @platinium może jakiś cache dla danych już otrzymanych?

S9
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1092
1

Czekam po 4-5, czasem 6 sekund na response.
Możecie doradzić jak to usprawnić by nie zajechać aplikacji? Boję się że w obecnym przypadku - gdy kilkudziesięciu klientów odpali tą funkcjonalność to wszystkie wątki w mojej spring bootowej aplikacji będą zajęte oczekiwaniem na response.

Nie powinno być tak że jeśli tak długo czekasz to korzystasz w tej samej puli wątków w całej aplikacji. Jest to system zewnętrzny? Możesz cachować dane i czy cachowanie ma sens w tym przypadku?

jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4714
2

Są dwa problemy:

  1. Twoja aplikacja zemrzy bo wyczerpiesz swoją pule wątków.
    Tak bywa - *proste *rozwiązanie tego to olanie wątków i przejście na non blocking - spring webflux będzie ok.
  2. Zemrze serwis, z którego korzystasz bo go zarypiesz żądaniami. Po przejściu na non blocking to się często zdarza - zrobiłem to nie raz
    Rozwiązanie to rate limiter i circuit breaker - jest kilka rozwiązań na to. Z gotowców to można użyć https://resilience4j.readme.i (integruje się z reactorem, a przez to webflux)
Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1914
2

Do podejścia non-blocking dodam jeszcze:

  1. Może wystarczy osobna monitorowana pula wątków, żeby moc to skalowac i nie wyczerpać własnej puli. Tutaj zalecałbym ostrożność i zrobienie testów wydajnościowych, czy rzeczywiście ten drugi serwis wytrzyma większy load
  2. Może da się odwrócić komunikacje, żeby pozyskiwać dane a nie ciagle pytać

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.