Я работаю над стресс-тестированием для сервера REST. Моя цель - создать метод mock controller, который будет вызывать 404 ошибки каждые 100 запросов (другие результаты 200 OK) и проверить общее количество отправленных запросов и неудачных.Как написать счетчик постоянных запросов REST
Проблема заключается в том, что я использую ConcurrentHashMap и AtomicInteger для подсчета этих цифр, количество неудачных запросов варьируется + -20. Синхронизация RequestCounter.addFailed() не помогла. Единственный способ, которым я нашел, - синхронизировать метод контроллера, но это не вариант.
Я выполняю 220_000 запросов стресс-теста с 20 потоками через Jmeter. Вот мой контроллер:
@RequestMapping(value = "/items/add", method = RequestMethod.POST)
public ResponseEntity addGDT(@RequestBody String data, Principal principal) {
RequestCounter.add();
if ((RequestCounter.getCounts().get("ADD").longValue() % 100) == 0) {
RequestCounter.addFailed();
return ResponseEntity.notFound().build();
} else {
return ResponseEntity.ok().build();
}
}
Количество запросов отсчитывается здесь:
public class RequestCounter {
static Map<String, AtomicInteger> counts = new ConcurrentHashMap<>();
static {
counts.put("ADD", new AtomicInteger(0));
counts.put("ADD_FAILED", new AtomicInteger(0));
}
public static void add(){
counts.get("ADD_GDT").incrementAndGet();
}
public static void addFailed(){
counts.get("ADD_FAILED").incrementAndGet();
}
UPDATE Я последовал совету javaguy и переработан код, удалив карту и работать с AtomicInteger переменными непосредственно. Но результат все равно непредсказуем: failedRequestCount по-прежнему варьируется от + -3
public class RequestCounter {
static AtomicInteger failedRequestsCounter = new AtomicInteger(0);
...
public static void addGDTFailed(){
failedRequestsCounter.incrementAndGet();
}
Update2 ситуация не была решена ни путем вызова напрямую поточно-переменную, ни путем разделения и синхронизации способа получать модуль
вы можете взглянуть и сообщить мне, если мое решение сработало – developer