Архитектура статистики с группировкой по диапазонам
Нужно сделать на подобие такой штуки с группировкой по h , d, w, y: (только не проценты , а значения).
Имеется кафка куда складываются сообщения
Куда должны прийти это структура такого вида. Это как суммарно агрегационная результирующая сущность. Замечу что в одной сущности могут быть несколько полей (Likes\View допустим) диапазонов.
{
ItemId: 1,
Likes: {
current: 3,
prevHour: 4,
prevWeek: 5,
},
Views: {
current: 33,
prevHour: 44,
prevWeek: 55,
}
}
Что я пытался
Использовать KSQLDB , сделал агрегации вида:
stats_likes_h stats_likes_w stats_views_h stats_views_w
Потом эти stream join в один, но оказывается что на текущий момент в KSQLDB никак нельзя взять со смещением офсет. Т.к. нужно не последние "корзинки" брать , а последние значение предыдущего часа\месяца\недели\года.
хотел сделать MongoDB + свой сервис который разгребает очередь KAFKA , но тут возникла проблема , если 1 сообщения = 1 update в базу, нагрузка очень высока. Если пытаться в коде делать Kafka batching то возникают проблемы с commit таймаутами , идемпотентностью и т.д. т.к. для этого кафка не предназначена.
дошли руки до TimescaleDB Тут есть материализованные представления с просчетом, соответственно и функция LAG\LEAD которые смогли сделать то что нужно
select lag(value, 1) over (order by bucket), lag(value, 124) over (order by bucket), lag(value, 124*7) over (order by bucket) from stats_likes_h order by bucket desc limit 1
Так же и для view, а потом при выборки join. Но если у тебя много сущностей, а не только Likes | Views , то колво join так же увеличатся, а материализованное просчитанное представление НЕЛЬЗЯ сделать поверх другого просчитанного представления.
Я не чувствую что вариант с timescaleDB очень оптимальный. Вопрос куда смотреть ? Что еще можно пощупать? Какие еще базы данных существуют с continues queries(иногда называют continiues aggregation или materialize continiues aggregation)? В Apache там хрен ногу сведет , штук 20 похожих проектов, возможно не от апача...
В общем думаю ктото делал подобные вещи, жду рекомендаций.
