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