Я разрабатываю систему, которая должна анализировать большое количество пользовательских транзакций и производить агрегированные показатели (, такие как тенденции и т. д. ). Система должна работать быстро, быть надежной и масштабируемой. Система основана на 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 для реализации, но я бы предпочел оставить это обсуждение на уровне дизайна, насколько это возможно.
Список компонентов системы:
Задача, которая отслеживает входящие файлы каждую минуту.
Задача, которая прочитала файл,разобрать его и сделать доступным для других системных компонентов и алгоритмов.
Компонент для буферизации 10 записей для пользователя (не более 5 минут ), когда собрано 10 записей или прошло 5 минут, пора отправлять данные алгоритму для дальнейшей обработки. Поскольку требование состоит в том, чтобы предоставить как минимум 10 записей для алгоритма, я подумал об использовании Storm Field Grouping (, что означает, что одна и та же задача вызывается для одного и того же пользователя )и отслеживает набор 10 пользовательских записей внутри задачи. конечно, я планирую иметь несколько таких задач, каждая из которых обрабатывает часть пользователей.
Есть и другие компоненты, которые работают с одной транзакцией, для них я планирую создать другие задачи, которые получают каждую транзакцию по мере ее разбора (параллельно с другими задачами ).
Мне нужна ваша помощь с #3.
Каковы наилучшие методы разработки такого компонента? Очевидно, что ему необходимо хранить данные по 10 записям для каждого пользователя. Карта ключ-значение может помочь. Лучше ли управлять картой в самой задаче или использовать распределенный кеш? Например, Redis представляет собой хранилище значений ключей (. Я никогда не использовал его раньше ).
Спасибо за помощь