Реализация потокобезопасного ограничителя скорости на основе скольжения в JavaJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Реализация потокобезопасного ограничителя скорости на основе скольжения в Java

Сообщение Anonymous »

Я разрабатываю ограничитель скорости на основе скользящего окна, и могу предложить следующий подход

Код: Выделить всё

package RateLimiter;

import lombok.Getter;

import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

@Getter
class Request{
private final String userId;
private final Long time;

Request(String userId, Long currentTime){
this.userId = userId;
this.time = currentTime;
}
}

public class RateLimiter {
Map requestsMap;
int threshold;
long timeWindow;
int noOfRequestsServed;
RateLimiter(int _threshold, int timeWindow, TimeUnit unit){
requestsMap = new HashMap();
threshold = _threshold;
this.timeWindow = unit.toMillis(timeWindow);
noOfRequestsServed = 0;
}

public synchronized boolean canAccept(String userId){
long currentTime = System.currentTimeMillis();
if(!requestsMap.containsKey(userId))
{
requestsMap.computeIfAbsent(userId, k -> new LinkedList()).add(new Request(userId, currentTime));
noOfRequestsServed++;
return true;
}

evict(userId, currentTime);
if(requestsMap.get(userId).size() >= threshold)
return false;
else
{
Queue userList = requestsMap.get(userId);
userList.add(new Request(userId, currentTime));
requestsMap.put(userId, userList);
noOfRequestsServed++;
return true;
}
}

private synchronized void evict(String userId, long currentTime) {
//        System.out.println("Thread used for eviction is " + Thread.currentThread().getName());
Queue userRequestList = requestsMap.get(userId);
while(!userRequestList.isEmpty() && userRequestList.peek().getTime() + timeWindow < currentTime){
userRequestList.poll();
}
requestsMap.put(userId, userRequestList);
}

public static void main(String[] args) throws InterruptedException {
RateLimiter limiter = new RateLimiter(5, 10, TimeUnit.SECONDS);
ExecutorService executorService = Executors.newFixedThreadPool(10);
executorService.execute(() -> {
for(int i = 0; i {
for(int i = 0; i {
for(int i = 0; i

Подробнее здесь: [url]https://stackoverflow.com/questions/79196045/implementing-a-thread-safe-sliding-based-rate-limiter-in-java[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»