Multithreading - jak ugryźć to zadanie ?

2018-08-20 15:45
WielkiCho
0

Witam

Mam do zrobienia zadanie, które jest w załączniku. Nie za bardzo wiem jak się za to w ogóle zabrać. Przyjmę jakąkolwiek radę, albo jakiś link do informacji, które mi w tym pomogą.

Pozdrawiam

Pozostało 580 znaków

2018-08-20 16:48
0

Ogólnie throttling to jest stary temat więc możesz w necie znaleźć masę bibliotek wraz z kodami źródłowymi i podpatrzeć jak to ludzie ograli.
Tutaj jakieś springowe rozwiązanie. Na adnotacjach więc łatwo można wykorzystać w serwisach
https://github.com/weddini/spring-boot-throttling

Na pewno musisz trzymać gdzieś dane o tym ile requestów aktualnie jest przetwarzanych jakoś thread-safe.
Może jakiś singleton, albo klasa w stylu

public class RequestThrottling {
  public volatile int requestCounter = 0;
  public volatile List<RequestCounterPerUser> requestCounterPerUser;
}

@Service
class MySuperService {

  final RequestThrottling requestThrottling = new RequestThrottling();
  RequestResponse processRequest(Data someData) {
  if (requestThrottling.requestCounter < 100) {
     requestThrottling.requestCounter += 1
     // Procesujemy request
  }
  else {
    throw new TooManyRequestsException();
  }
}
}

Nazwy metod/klas z d**y. Formatowanie z łapy.
Nie wiem czy konieczne jest to "czekanie jedną sekundę", ale jeśli tak to dać im sleepa po prostu? :D

edytowany 3x, ostatnio: TakiTamPiekarz, 2018-08-20 16:51

Pozostało 580 znaków

2018-08-20 18:17
1

Może takie siermiężne rozwiązanie:

class Rozwiazanie {

    // dostep ziomkow do systemu kontrolujemy semaforem i wpuszamy max. N ziomkow
    Semaphore limitUsers;

    // kazdy user ma skojarzony semafor na max. ilsoc zapytan Y
    Map<User,Semaphore>  limitTasksPerUser;

    // executor wykonuje rownoczesnie X zapytan 
    ThreadPoolExecutor executor;

    // dorabiamy API ... 
       Rozwiazanie(int maxUsers, int maxQueriesPerUser, int maxParallelTasks) {
            limitUsers = new Semaphore(maxUsers);
            executor  = (ThreadPoolExecutor) Executors.newFixedThreadPool(maxParallelTasks);
            ...
       }
}
edytowany 4x, ostatnio: yarel, 2018-08-20 18:19

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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