Я разрабатываю систему, которая должна анализировать большое количество пользовательских транзакций и производить агрегированные показатели (такие как тенденции и т. д.). Система должна работать быстро, быть надежной и масштабируемой. Система основана на 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 — хранилище значений ключей (я никогда раньше им не пользовался).
Спасибо за вашу помощь