10 подписчиков
Раньше если я хотел посчитать количество каких-то уникальных сущностей за определённые интервалы времени я брал общий поток событий, группировал их в какие-то интервалы, например, сначала в минутные. И в самом этом интервале держал множество этих сущностей. Потом объединял минутные интервалы в часовые, объединял множества и так далее. В итоге как-то плохо всё шло, т.к. объём интервалов растёт, как-то неудобно его хранить становится, нужно множество это куда-то выносить, непонятно куда.
С перцентилями так же. Чтобы их считать нужно иметь на руках весь массив сортированных значений. Та же проблема, в мелких интервалах он небольшой, а как начинаем объединять их в более крупные мержить массивы довольно легко, но они быстро здоровыми становятся.
А теперь понял, что нужна просто вспомогательная коллекция и все проблемы уходят.
Начнём с количеств, они попроще. Чтобы не сильно абстрактно было, будем считать количество уникальных активных пользователей.
◾️ У нас есть исходная коллекция, ключи в которой это время события, а в значениях лежит пользователь, который совершил какое-то действие
◾️ Преобразовываем её в коллекцию userActivity, где ключи это <timestamp> <userId>, а значения пустые
◾️ Делаем коллекции userActivity:1h:count, userActivity:1d:count, userActivity:1w:count, userActivity:1M:count, ключи которой будут <intervalStartTimestamp>, а в значении будет число. intervalStartTimestamp это начало часа/дня/недели/месяца
◾️ Когда проводим аггрегацию просто считаем сколько ключей было добавлено/удалено с прошлого раза, меняем итоговое значение
Готово. Теперь у нас не болит голова от того, что единичные записи могут расти бесконтрольно, свалили все заботы на базу, пусть там колдует, шардирует, только диски ей лишние покупай. Плюс сюда можно докрутить всякого, например, в userActivity делать не пустые значения, а ещё доставать тип действия, ну и потом во всех последующих преобразованиях считать их тоже, получим ещё график того, как менялись поведения со временем (хотя относительно конкретно этого примера лучше отдельно считать, чтобы логику не усложнять).
#diffbelt
1 минута
10 ноября 2022