в процессе внедрения debezium и методологии cdc в нашу дата платформу на меня прилетела задача настроить мониторинг кафки. кафка по сути быстрая база данных в которую ежесекундно прилетают сообщения из разных сервисов
с наскока у меня получилась простая система: я подключался к кафке -> получал сообщение -> увеличивал счетчик -> выводил итоговую цифру. проблема номер один: счетчик увеличивался бесконечно. чтобы отследить изменения на миллиардах нужно было записывать цифру на листочек
решение проблемы номер один: смотреть количество событий за последние 5 минут проблема решения проблемы номер один: событий много, а это значит у нас много временных меток, а это значит что нам каждые 5 секунд придется сортировать список из временных меток а мне это не очень нравилось
в итоге я пришел к интересному решению 1. каждому новому событию я присваивал уникальный ключ - юникс время получения. юникс время считается от 1900 года как с нуля и с миллискундами. каждую секунду я получал массив больших чисел. плюсы: все они почти уникальны, они последовательны, то есть их можно удобно сортировать. минусы: эти числа ооооочень большие. 2. вместо списков для хранения большого количества больших чисел я решил использовать np.array тк он реализует список как си массив, то есть в np.array мы храним только объекты, а в списке python массив УКАЗАТЕЛЕЙ. 3. теперь самое интересное. есть большой список больших чисел. чтобы получить числа которые мы получили не менее чем 5 минут назад нам надо перевести (сейчас - 5 минут назад) в точно такое же юникс число и сделать выборку из списка по правилу > unix_timestamp(now() - 5 minutes).
таким образом в течении дня собираем большой список, каждый раз когда нам надо посмотреть сколько событий пришло за последние 5 минут отбираем числа по правилу, вечером чистим список, повторяем
по умному это называется алгоритмом скользящего окна (sliding windows) с использованием фильтрации