Допустим у меня есть сущность loan, у нее поле country. Я хотел бы как-то реагировать на случай превышения некоторого числа запросов на секунду времени на контроллер с определенным значением country. Существует ли не велосипедный способ это сделать ?
При помощи Dropwizard Metrics можно сделать это примерно так:
Создаем MetricRegistry в конфигурационном классе
@Bean
public MetricRegistry metricRegistry() {
return new MetricRegistry();
}
В контроллере получаем экземпляр счетчика для конкретной страны, крутим его, при превышении порогового RPS что-то делаем:
public static class MyController {
@Autowired
private MetricRegistry metricRegistry;
public void handleLoan(String country) {
Meter meter = metricRegistry.meter(MetricRegistry.name("loan", country));
meter.mark();
if (meter.getOneMinuteRate() > TRESHOLD) {
// обрабатываем превышение RPS
}
// ваша бизнес-логика
}
}
Meter предоставляет экспоненциально-взвешенное скользящящее среднее значение RPS для минутного, пятиминутного и пятнадцатиминутного окна. Если вам нужна другая гранулярность, вы на базе класса com.codahale.metrics.EWMA легко сделаете свой Meter.
Задача слишком специфичная, чтобы сразу без велосипеда поехать :). Самый верный способ решения, на мой взгляд, это сделать класс, реализующий бизнес логику по подсчету и сбросу счетчика.
public class MetricCounter {
//период накопления счетчика вызовов
private static Integer periodInSeconds;
//начала очередного подсчета периода
private static volatile org.joda.time.DateTime lastDtRun;
//хранит счетчик запусков за период времени periodInSeconds
private static volatile AtomicInteger counter;
//если counter станет больше alarmCounter, то hasNextRun() вернет false.
private static volatile Integer alarmCounter;
//некий метод обертка, который увеличивает счетчик на +1
// и следит за периодами и сбросом счетчика
//возвращает true, если укладываемся в показатели, иначе false.
public synchronized AtomicBoolean hasNextRun() {
}
}
Если всё это еще и обернуть в свои аннотации, то можно довольно удобно использовать в коде.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей