Есть ли простой способ в spring boot подсчитать количество запросов за временной промежуток?

312
23 сентября 2017, 21:58

Допустим у меня есть сущность loan, у нее поле country. Я хотел бы как-то реагировать на случай превышения некоторого числа запросов на секунду времени на контроллер с определенным значением country. Существует ли не велосипедный способ это сделать ?

Answer 1

При помощи Dropwizard Metrics можно сделать это примерно так:

  1. Создаем MetricRegistry в конфигурационном классе

    @Bean
    public MetricRegistry metricRegistry() {
        return new MetricRegistry();
    }
  2. В контроллере получаем экземпляр счетчика для конкретной страны, крутим его, при превышении порогового 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.

Answer 2

Задача слишком специфичная, чтобы сразу без велосипеда поехать :). Самый верный способ решения, на мой взгляд, это сделать класс, реализующий бизнес логику по подсчету и сбросу счетчика.

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() {
    }
}

Если всё это еще и обернуть в свои аннотации, то можно довольно удобно использовать в коде.

READ ALSO
Многопоточность и swing

Многопоточность и swing

Есть простой интерфейс, при нажатии кнопки запускается процесс обработки загруженных данных

331
генерация сервисов с помощью swagger api java

генерация сервисов с помощью swagger api java

как генеряться сервисы в swagger api на java

297
Class, variable, type and object [требует правки]

Class, variable, type and object [требует правки]

вчем разница между variable, object,type and class

225
Как переопределить кнопку в JOptionPane

Как переопределить кнопку в JOptionPane

Подскажите, как для JOptionPaneshowMessageDialog() переопределить кнопку, что бы она не закрывала диалог, а вызывала, например, System

335