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

Events 用于查询不同时间间隔内的事件数的数据结构,events,data-structures,time-series,influxdb,Events,Data Structures,Time Series,Influxdb,我的程序在一秒钟内接收来自不同类型的数千个事件。例如,拥有数百万个不同IP地址的用户每秒可访问100k API。我想在1分钟、1小时、1天等时间内保存统计数据并限制访问次数。所以我需要每个用户在最后一分钟、每小时或每一天的事件计数,我希望它像一个滑动窗口。在这种情况下,事件的类型是用户地址 我开始使用一个时间序列数据库,XDB;但它未能每秒插入100k个事件,而在一分钟或一小时内聚合查询以查找事件计数则更糟糕。我确信XDB不能每秒插入100k事件,同时执行300k聚合查询 我不希望从数据库中检索

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

我开始使用一个时间序列数据库,XDB;但它未能每秒插入100k个事件,而在一分钟或一小时内聚合查询以查找事件计数则更糟糕。我确信XDB不能每秒插入100k事件,同时执行300k聚合查询

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

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

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


有没有什么好的数据结构,甚至是数据库

您可以考虑使用hazelcast集群而不是简单的ram。我也认为是灰色或简单的弹性座椅,但这种负载你应该测试一下。您也可以考虑您的数据结构。您可以为每个地址构造一个小时映射,并将事件放入小时桶中。当时间过了一个小时,你可以计算这个小时的存储桶中的计数和缓存。当您需要一分钟的粒度时,您可以转到hours bucket并计算该小时列表下的事件。

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

一种可能的解决方案是使用数据库。 建议模式的大致描述:

  • 将应用程序中传入的原始事件加载到基于内存的表中 使用
    缓冲存储引擎
  • 在另一个视图中创建每分钟聚合的物化视图 带缓冲引擎的基于内存的表EventsMinute
  • EventsPerHour
  • 或者,使用Grafana和clickhouse数据源插件来构建 仪表盘
  • 在Clickhouse DB Buffer存储引擎中,与任何磁盘表都不关联的数据将完全保存在内存中,旧数据将自动替换为新数据。这将为您提供简单的原始数据管理

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


    在每秒10万个事件的情况下,您可能需要在数据库前面安装某种整形器/负载平衡器。

    您可以考虑使用hazelcast群集,而不是简单的ram。我也认为是灰色或简单的弹性座椅,但这种负载你应该测试一下。