Почему счетчик, увеличенный с помощью инструкции INCR, не равен количеству запросов, когда параллелизм HTTP-запроса увеличивается? - PullRequest
1 голос
/ 23 сентября 2019

Я делаю нагрузочное тестирование на сервере Redis.Я хотел протестировать операцию INCR в Redis, где я инициализирую счетчик на 1 (установив ключ с именем total-Call), а затем для каждого входящего запроса я увеличиваю счетчик на 1. Итак, после 3000 запросов,счетчик должен быть 3000, после 8000 запросов счетчик должен быть 8000.

Для этого я создал простой NodeJS скрипт, выполняющий express, и простое промежуточное ПО, увеличивающее счетчик.Я использовал loadtest для нагрузочного тестирования.Все работает нормально, когда нет параллелизма, но результаты расходятся на 1, 3 или 5, когда я увеличиваю параллелизм.Я не могу понять причину этого.

Так что для входного теста, где параллелизм равен 1, а количество запросов равно 3000:

loadtest -n 3000 -c 1 http://localhost:3000

команда redis get total-calls дает ожидаемый результатиз 3000.

Но если увеличить параллелизм до 5 и запустить ту же команду после удаления предыдущего ключа из redis, я получу общее число 300. Почему это происходит?

loadtest -n 3000 -c 5 http://localhost:3000

и при дальнейшем увеличении количества запросов до 8000 общее количество становится 8003. Я не могу понять причину этого.

Код, который попадает под нагрузку:

const express = require('express');
const app = express();
const Redis = require("./redis-wrapper");

const client = new Redis();
const maxCallsAllowed = 50000

const requestCounter = async (req, resp, next) => {
    // Increment the request counter
    const redis = client.redis;
    if(await redis.exists("total-calls") === 1) {
        // Key already exists
        // Increment the key
        await redis.incr("total-calls")
    }else {
        // Key does not exist
        // Set the key
        await redis.set("total-calls", 1)
    }
    next();
}

app.get('/', requestCounter, (req, resp, next) => {
    resp.json({
        status: 'ok'
    })
});

app.listen(3000);

Что-то мне не хватает?Почему количество больше, чем количество запросов?Я также проверил это с locust.io , но заметил то же самое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...