当前位置: 首页 > 知识库问答 >
问题:

一种用于查询不同时间间隔内事件数量的数据结构

鲜于俊侠
2023-03-14

我的程序在一秒钟内接收来自不同类型的数千个事件。例如,拥有数百万不同IP地址的用户可以在一秒钟内访问100k API。我想保持统计数据,并限制1分钟、1小时、1天等时间内的访问次数。所以我需要每个用户在最后一分钟、一小时或一天内的事件计数,我希望它像一个滑动窗口。在这种情况下,事件类型是用户地址。

我开始使用时间序列数据库,流入数据库;但它未能每秒插入100k个事件,并且聚合查询以在一分钟或一小时内查找事件计数甚至更糟。我确信InfluxDB无法每秒插入100k事件并同时执行300k聚合查询。

我不想从数据库中检索事件,因为它们只是一个简单的地址。我只想在不同的时间间隔里,尽可能快地数出来。我想获得特定时间间隔(例如,过去1小时)内x类型事件的数量。

我不需要将统计数据存储在硬盘中;所以也许一个在不同时间间隔内保持事件计数的数据结构对我来说是好的。另一方面,我需要它像一个滑动窗口。

我想到的另一个解决方案是将RAM中的所有事件存储在一个链表中,并对其进行迭代以回答查询,但是因为事件的数量太多,所以将所有事件保存在RAM中不是一个好主意。

是否有任何良好的数据结构甚至数据库用于此目的?

共有2个答案

慕容宏邈
2023-03-14

您可以考虑用hazelcast集群代替简单的ram。我也认为灰色或简单的弹性搜索,但有了这种负载,你应该测试一下。你也可以考虑你的数据结构。您可以为每个地址构建一个小时图,并将事件放入小时桶中。当时间过了一个小时,您可以计算这个小时的存储桶中的计数和缓存。当您需要一个分钟粒度时,您可以转到小时桶,并在该小时列表下统计事件。

牧熙云
2023-03-14

关于事件输入格式以及如何将事件传递到统计后端,您没有提供足够的详细信息:它是udp消息流、http put/post请求还是smth else。

一种可能的解决方案是使用Yandex Clickhouse数据库。建议模式的粗略描述:

  1. 使用缓冲区存储引擎将来自应用程序的传入原始事件加载到基于内存的表中事件
  2. 在另一个基于内存的表中创建具有每分钟聚合的具体化视图 事件每分钟使用缓冲区引擎
  3. 对事件“每小时”中每小时聚合的数据执行相同的操作
  4. (可选)将Grafana与点击式数据源插件结合使用来构建仪表板

在Clickhouse中,与任何磁盘表无关的DB缓冲区存储引擎将完全保留在内存中,较旧的数据将自动替换为新数据。这将为您提供原始数据的简单内务管理。

如果您想在磁盘上保留统计信息,还可以使用MergeTree存储引擎创建表(物化视图)EventsPerMinute和EventsPerHour。Clickhouse可以轻松处理数十亿条记录。

在每秒 100K 个事件时,您可能需要在数据库前面安装某种整形器/负载平衡器。

 类似资料:
  • 有数百万个不重叠的连续间隔,如[a,c]、[c,e]、[e,g)……它们以随机顺序发送给我,我想随时查询是否可以用接收到的这些连续间隔的组合来封闭其他给定间隔。 例如,我希望有一个方法来添加一个连续的间隔,一个方法来测试一个任意的间隔是否可以被之前添加的间隔组合所包围。 类似于 想知道什么是适合这种情况的数据结构? 如果有区别,我们可以假设的边界总是与一些s的边界匹配,因此在上面的示例中,不会有一

  • 我现在正在研究一个有趣的问题,我想知道是否有人成功地实现了高性能的解决方案。 我有一组“区间”,意思是一个数组,每个数组的形式 所有这些值都是实值。现在我有一个数字,我想问,哪些区间包含这些数字?我需要能够很快回答这个问题。我可以根据需要进行预处理,空间比时间更重要。你会推荐什么方法?提前谢谢!

  • 我正在用chartjs绘制一个图形,其中x轴表示时间,y轴表示相应的数据。 现在我得到了今天、上周、上月和去年的数据。 }; 当我绘制图形时,每个点之间的距离是相同的。但这是不正确的,因为时间间隔不相同。 “去年”和“上月”之间的距离应大于“上周”和“上个月”之间的间隔。 任何人一个想法如何我可以实现这与chartjs,当我看留档我没有看到任何选项。

  • 我需要有关构建SQL查询的帮助: 这是我用来存储测试运行统计信息的postgres表。 此表包含测试开始时间、结束时间和状态。我需要计算由于测试失败而使用的时间间隔。即测试失败和下一个立即测试开始之间的时间间隔。 即对于每个测试失败的记录,获取end_date并获取同一测试的下一个即时记录的start_date。计算时间差。将所有此类失败记录的持续时间相加,并按失败次数计算。以获得平均值。 例子:

  • 我在为考试学习时发现了我无法处理的问题: 设计一个用于处理(封闭)间隔的数据结构,它将提供三个操作: 插入(x,y)-添加间隔[x,y] 移除(x,y)-移除间隔[x,y] Count(x,y)-计算纯粹包含在区间内的区间数[x,y] x、 y是从1到n的整数。所有操作最多需要O((log n)2) 有人能帮忙吗?

  • 假设我有一个股票市场交易事件流,如下所示: 使得technicalN(其中N是一些数字)代表给定公司的日终股票市场交易数据的第N个技术交易条目[开盘(浮动)、高位(浮动)、低位(浮动)、收盘(浮动)、成交量(int)]。(即ticker GOOG的技术1不同于ticker MSFT的技术1。)如: (请注意,这些交易价格/交易量完全是虚构的。 假设我想创建一个大小为2、时间间隔为1天的窗口,这样我