我正在设计一个系统,该系统应该分析大量用户事务并生成汇总度量(例如趋势等)。该系统应该工作快速、健壮和可扩展。系统是基于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 条用户记录以实现最佳操作,如果 5 分钟后找不到 10 条记录,它应该使用任何可用的数据。
我想使用 Storm 来实现,但我更愿意尽可能将这个讨论留在设计级别。
系统组件列表:
每分钟监视传入文件的任务。
读取文件、解析文件并使其可用于其他系统组件和算法的任务。
一个组件为用户缓冲 10 条记录(不超过 5 分钟),当收集到 10 条记录或 5 分钟过去时,是时候将数据发送到算法进行进一步处理了。由于要求为算法提供至少 10 条记录,我想到了使用 Storm Field Grouping(这意味着为同一用户调用相同的任务)并跟踪任务中 10 条用户记录的集合,当然我计划有几个这样的任务,每个处理一部分用户。
还有其他组件可以处理单个事务,对于它们,我计划创建其他任务来接收每个被解析的事务(与其他任务并行)。
#3 我需要你的帮助。
设计这样一个组件的最佳实践是什么?很明显,它需要为每个用户维护 10 条记录的数据。键值映射可能会有所帮助,是在任务本身中管理映射还是使用分布式缓存更好?例如 Redis 一个键值存储(我以前从未使用过它)。
谢谢你的帮助