Проектирование системы аналитической обработки в реальном времени

Я разрабатываю систему, которая должна анализировать большое количество пользовательских транзакций и производить агрегированные показатели (, такие как тенденции и т. д. ). Система должна работать быстро, быть надежной и масштабируемой. Система основана на Java (на Linux ).

Данные поступают из системы, которая генерирует файлы журналов (CSV на основе )пользовательских транзакций. Система генерирует файл каждую минуту, и каждый файл содержит транзакции разных пользователей (, отсортированные по времени ), каждый файл может содержать тысячи пользователей.

Пример структуры данных для CSV-файла:

10 :30 :01, пользователь 1,...
10 :30 :01, пользователь 1,...
10 :30 :02, пользователь 78,...
10 :30 :02, пользователь 2,...
10 :30 :03, пользователь 1,...
10 :30 :04, пользователь 2,...
...

Система, которую я планирую, должна обрабатывать файлы и выполнять некоторый анализ в режиме -времени. Он должен собирать входные данные, отправлять их нескольким алгоритмам и другим системам и сохранять вычисленные результаты в базе данных. База данных не содержит фактических входных записей, а только высокоуровневый агрегированный анализ транзакций. Например тренды и т.д.

Первый алгоритм, который я планирую использовать, требует для лучшей работы не менее 10 пользовательских записей, если он не может найти 10 записей через 5 минут, он должен использовать любые доступные данные.

Я хотел бы использовать Storm для реализации, но я бы предпочел оставить это обсуждение на уровне дизайна, насколько это возможно.

Список компонентов системы:

  1. Задача, которая отслеживает входящие файлы каждую минуту.

  2. Задача, которая прочитала файл,разобрать его и сделать доступным для других системных компонентов и алгоритмов.

  3. Компонент для буферизации 10 записей для пользователя (не более 5 минут ), когда собрано 10 записей или прошло 5 минут, пора отправлять данные алгоритму для дальнейшей обработки. Поскольку требование состоит в том, чтобы предоставить как минимум 10 записей для алгоритма, я подумал об использовании Storm Field Grouping (, что означает, что одна и та же задача вызывается для одного и того же пользователя )и отслеживает набор 10 пользовательских записей внутри задачи. конечно, я планирую иметь несколько таких задач, каждая из которых обрабатывает часть пользователей.

  4. Есть и другие компоненты, которые работают с одной транзакцией, для них я планирую создать другие задачи, которые получают каждую транзакцию по мере ее разбора (параллельно с другими задачами ).

Мне нужна ваша помощь с #3.

Каковы наилучшие методы разработки такого компонента? Очевидно, что ему необходимо хранить данные по 10 записям для каждого пользователя. Карта ключ-значение может помочь. Лучше ли управлять картой в самой задаче или использовать распределенный кеш? Например, Redis представляет собой хранилище значений ключей (. Я никогда не использовал его раньше ).

Спасибо за помощь

5
задан Matthias J. Sax 23 November 2015 в 13:24
поделиться