Агрегации с низкой задержкой на Кассандре
Мы внедряем в нашу систему множество метрик временных рядов. Мы не можем справиться с нагрузкой записи с нашей текущей инфраструктурой. Итак, мы оцениваем кассандру.
Больше информации о нашей существующей системе реального времени
- Мы собираем метрики временных рядов для конкретных приложений
- Пишем их в БД
- Вот пример данных, которые мы отслеживаем
{ appId: 'applicationId', route: 'routeName', time: 1406845866304, resTime: 500, dbTime: 200 }
- Затем, после добавления данных, мы объединяем их в разные разрешения с течением времени.
- Например, у нас есть предварительно агрегированные данные для 1-минутного, 30-минутного, 3-часового, дневного разрешения для каждого отслеживаемого нами показателя.
Тогда наше приложение будет задавать разные вопросы, как показано ниже. Мы делаем adhoc агрегации, чтобы их закрепить.
- дайте мне среднее время ожидания за этот период времени X
- перечислите мне топ-10 маршрутов с более высоким временем ожидания за данный период времени
Касается Кассандры
Мы можем выполнить предварительную агрегацию с помощью cassandra, запустив несколько фоновых заданий. Но нам нужно выполнять специальные запросы с низкой задержкой (менее 5 мс). С нашими предварительно агрегированными данными это кажется тривиальным.
Но поскольку у cassandra нет поддержки агрегации, нам нужно найти какое-то другое решение. Мы попробовали спарк (без кассандры) с некоторыми источниками данных в памяти. Но для агрегирования небольшого количества данных, подобных этой, потребовалось больше времени.
Таким образом, единственно возможный вариант - создать механизм агрегации поверх кассандры. Я просто хочу знать, есть ли другие способы сделать это или есть какие-то существующие решения?