- Глобальный предел - общие запросы в минуту по системе.
- - запросы на индивидуальные пользователи
- конечная точка/предел API - запросы в минуту для конкретного маршрута API.
то, что я пробовал до сих пор:
Я написал пользовательский bucket bucket с использованием атомиклонга for tokens and tokens and tokens and tokens and tokens and ukensexeex. Каждый ограничитель работает индивидуально, и я поддерживаю ограниченные ограничения для каждого пользователя и для каждой точки, используя concurrenthashmap .
Вот грубый набросок того, как я это делаю:
public boolean allowRequest(String userId, String endpoint) {
if (!globalLimiter.tryConsume()) return false;
UserLimiter userLimiter = userLimiters.computeIfAbsent(userId, id -> new UserLimiter());
if (!userLimiter.tryConsume()) return false;
EndpointLimiter apiLimiter = apiLimiters.computeIfAbsent(endpoint, ep -> new EndpointLimiter());
if (!apiLimiter.tryConsume()) return false;
return true;
}
< /code>
Эта логика работает внутри контроллера, который обрабатывает запросы. < /p>
Проблема: < /strong> < /h3>
- Иногда токен получает поглощенным на ограничение. Это означает, что я уже использовал токен, но не обработал запрос - по существу тратящий токены .
- Поскольку каждый ограничен проверяется отдельно, я сталкиваюсь с в высоком сопутствующем положении - особенно с общим состоянием, подобным глобальному ограничению. makes it safe, but kills performance.
- There's no atomic rollback of tokens if one of the deeper limiters fails.
- Дизайн или подход, где все ограничители могут быть проверены атомно - либо все позволяют запросить и потреблять токены, либо ни один из них не делает.
- . очереди/актеры для решения этого.
- Любые примеры или лучшие практики для построения , ограничиваемых частоты частоты, в java.
java 17 < /p>
< /li>
работа на основе Spring Boot Mervic запросы) < /p>
< /li>
< /ul>
Любая помощь или идеи ценится. Если есть более разумный способ структурировать это, не теряя производительности или правильности, я хотел бы услышать это. Заранее спасибо!
Подробнее здесь: https://stackoverflow.com/questions/797 ... er-in-java