我有一个需求,我正在寻找是否已经有这样一个问题的解决方案。
我有一个整数数据流,我们称它为 x
,来自一个有时间戳的源。我需要将最大和最小值的 x
当年 2 minutes
, 5 minutes
, 15 minutes
等,并保存在DB中。
我想过在内存中进行汇总,然后在每个时间段结束时将汇总结果保存到DB中。但是,如果应用程序崩溃或重启,那么我将失去这些数据。这让我想到是否已经有了解决这样问题的方法。
编辑: 更多细节
数据是一种大规模的单一标签数据,如 {label, x, timestamp}
. 我不想存储我得到的所有数据。我只需要保存每个时间窗口的最小和最大数据。
例如,下面是一个数据流。
time label value
1 A 200
1 A 12
1 B 23
2 A 23
2 B 400
3 A 23
3 B 2
4 A 4
4 B 12
Output needed
For the first five minute
A min: 4 max: 200
B min: 2 max: 400
Next five minute
.....
.....
你说的没错,在内存中聚合确实有可能在应用程序崩溃或其运行的节点突然死亡时丢失数据。它还会增加你代码的复杂性。
在你的具体例子中,你举了一个竞价系统的例子。 如果你是聚合竞价,你怎么知道谁的出价最高或最低? 这个系统只是为了分析的目的,还是为竞价系统本身提供动力?
你有几个选择。
你可以将聚合结果存储在数据库中,比如MySQL或Postgres。你必须确保这是一个 房委会 设置(如主从),以确保在节点故障时的正常运行时间。这种方法的缺点是,你的表一旦到了5M-10M的范围,性能就会开始下降。以每5分钟5000次计算,你会累积约1.4M天。 这在以后的道路上可能很快就会遇到扩展问题。我见过一些系统通过手动分区和分片来解决这个问题,这增加了相当多的开销。 你还必须处理数据的降采样以节省空间。
另一个选择是尝试一个专为这样的工作负载而设计的时间序列数据库,如 Hyprcubd. 声明:我是创始人。 如果它不适合你的用例,我不会建议你使用它。 如果你需要交易,这将不是一个很好的适合,因为Hyprcubd不支持交易。如果你跟踪的是 (time, label, bid)
,这可能是可行的。你甚至可以存储每一个原始出价,而不需要汇总。(time, label, bid, user)
这将大大简化你的代码。 这样你的代码就会变得无状态。