Multithreading - jak ugryźć to zadanie ?

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

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

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);
            ...
       }
}

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