Допустим у меня есть сущность 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() {
}
}
Если всё это еще и обернуть в свои аннотации, то можно довольно удобно использовать в коде.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть простой интерфейс, при нажатии кнопки запускается процесс обработки загруженных данных
вчем разница между variable, object,type and class
Подскажите, как для JOptionPaneshowMessageDialog() переопределить кнопку, что бы она не закрывала диалог, а вызывала, например, System