从 Kinesis 中的两个不同流获取数据?

Getting Data from two different Streams in Kinesis?

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

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

假设我有两个不同的流 stream1stream2 .

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

为什么不呢?从两个流中执行 get_records。

如果你的流每个只有一个分片,你也会看到所有的事件,因为建议用一个工人处理每个分片,但如果你的逻辑是以某种方式加入来自不同 sources/streams, 你可以用一个工人从两个流中读取来实现它。

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

  • 两个流各有一个分片 - 在这种情况下,您可以使用单个 worker 从回合流中读取并查看来自两个流的所有事件。您可以添加时间戳或其他键,以允许您 "join" worker 中的这些事件。

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

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

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