2

我正在尝试制作 Kinesis 消费者客户端。为了解决这个问题,我浏览了 Kinesis 的开发人员指南和 AWS 文档http://docs.aws.amazon.com/kinesis/latest/dev/kinesis-record-processor-implementation-app-java.html

我想知道是否可以从两个不同的流中获取数据并相应地处理它。

假设我有两个不同的 Streamsstream1stream2.

是否可以分别从流和进程中获取数据?

4

1 回答 1

5

为什么不?从两个流中获取记录。

如果您的流每个只有一个分片,您还将看到所有事件,因为建议使用单个工作人员处理每个分片,但如果您的逻辑以某种方式加入来自不同源/流的事件,您可以实现它一个工作人员从两个流中读取。

请注意,如果您有具有多个分片的流,则您的每个工作人员将只能看到部分事件。您可以有以下选项:

  • 两个流都有一个分片 - 在这种情况下,您可以使用单个工作人员从 bout 流中读取并查看两个流中的所有事件。您可以添加时间戳或其他键以允许您在工作程序中“加入”这些事件。

  • 一个带有一个分片的流 ( stream1 ) 和带有多个分片的第二个流 ( stream2 ) - 在这种情况下,您可以从所有工作人员的stream1中读取,这也将分别处理来自stream2的单个分片。您的每个工作人员都将看到 stream1 的所有事件及其在stream2事件中的份额。请注意,您可以使用单个分片(2MB/秒或 5 次读取/秒)从stream1读取事件的速度有限制,如果您在stream2中有许多分片,这可能是一个真正的限制。

  • 两个流都可以有多个分片——在这种情况下,确保您能够“加入”这些事件会更加复杂,因为您需要将写入和读取同步到这些流。您还可以使用单个工作人员从两个流的所有分片中读取,但这不是一个好习惯,因为它限制了您的扩展能力,因为您不再拥有分布式系统。另一种选择是在两个流中使用相同的partition_key,并且对两个流具有相同数量的分片和分区定义,并验证您正在从每个工作人员的每个流中读取“正确”分片,并且您每次您的一名工作人员出现故障并重新启动时,都会正确执行此操作,这可能有点复杂。

您可以考虑的另一种选择是将两种类型的事件写入单个流中,再次使用相同的partition_key,然后如果您需要以不同方式处理它们(例如,将它们写入不同的日志文件),则在读取器端过滤它们在 S3 中)。

于 2015-05-07T04:42:37.483 回答