Привет. Нужно сделать на подобие такой штуки с группировкой по h , d, w, y:
(только не проценты , а значения)

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