0

我需要处理来自 AWS Kinesis 流的数据,该流从设备收集事件。在过去 10 秒内收到的所有事件必须每秒调用处理函数。


说,我有两个设备 A 和 B 将事件写入流。我的过程的名称为 MyFunction 并采用以下参数:

  • 设备ID
  • 一段时间的数据数组

如果我在 10:00:00 开始处理(并且在过去 10 秒内已经积累了设备 A 和 B 的事件),那么我需要拨打两个电话:

  • MyFunction(А, {设备 A 从 09:59:50 到 10:00:00 的事件})
  • MyFunction(B, {设备 B 从 09:59:50 到 10:00:00 的事件})

下一秒,10:00:01

  • MyFunction(А, {设备 A 从 09:59:51 到 10:00:01 的事件})
  • MyFunction(B, {设备 B 从 09:59:51 到 10:00:01 的事件})

等等。


看起来累积从设备接收到的所有数据的最简单方法是将其内存存储在临时缓冲区中(当然只有最后 10 秒),所以我想先尝试一下。

我发现保存这种基于内存的缓冲区的最方便的方法是创建一个基于 Java Kinesis Client Library (KCL) 的应用程序。

我也考虑过基于 AWS Lambda 的解决方案,但看起来不可能将数据保存在内存中以供 lambda 使用。Lambda 的另一种选择是拥有 2 个函数,第一个函数必须将所有数据写入 DynamoDB,第二个函数每秒被调用以处理从数据库中获取的数据,而不是从内存中获取的数据。(所以这个选项要复杂得多)

所以我的问题是:实现这种处理的其他选择是什么?

4

1 回答 1

1

因此,您所做的称为“窗口操作”(或“窗口计算”)。有多种方法可以实现这一点,就像你说的缓冲是最好的选择。

  • 在内存缓存系统中:Ehcache、Hazelcast

在缓存系统中累积数据并选择适当的驱逐策略(在您的情况下为 10 分钟)。然后进行分组求和运算并计算输出。

  • 内存数据库:Redis、VoltDB

就像缓存系统一样,您可以使用数据库架构。Redis 可能是有帮助的和有状态的。如果您使用 VoltDB 或类似的 SQL 系统,调用“sum()”或“avg()”操作会更容易。

可以使用 Spark 进行计数。您可以尝试 Elastic MapReduce (EMR),这样您将留在 AWS 生态系统中,并且集成会更容易。

于 2016-05-11T08:28:35.707 回答