Моя программа получает тысячи событий в секунду от разных типов. Например, 100 тыс. API-доступа в секунду от пользователей с миллионами разных IP-адресов. Я хочу вести статистику и ограничить количество обращений за 1 минуту, 1 час, 1 день и так далее. Поэтому мне нужно количество событий в последнюю минуту, час или день для каждого пользователя, и я хочу, чтобы оно было как скользящее окно В этом случае тип события - это адрес пользователя.
Я начал использовать базу данных временных рядов InfluxDB; но ему не удалось вставить 100 тыс. событий в секунду, а агрегированные запросы для поиска количества событий за минуту или час еще хуже. Я уверен, что InfluxDB не способен вставлять 100 тыс. Событий в секунду и одновременно выполнять агрегированные 300 тыс. Запросов.
Я не хочу, чтобы события извлекались из базы данных, потому что они являются простым адресом. Я просто хочу посчитать их как можно быстрее в разные промежутки времени. Я хочу получить количество событий типа x за определенный промежуток времени (например, за последние 1 час).
Мне не нужно хранить статистику на жестком диске; так что, может быть, структура данных для хранения количества событий в разные промежутки времени мне подходит. С другой стороны, мне нужно, чтобы оно было как скользящее окно.
Хранение всех событий в ОЗУ в связанном списке и итерирование по нему для ответа на запросы - еще одно решение, которое мне приходит в голову, но, поскольку число событий слишком велико, сохранение всех событий в ОЗУ не может быть хорошая идея.
Существует ли какая-либо хорошая структура данных или даже база данных для этой цели?