我正在尝试制作 Kinesis 消费者客户端。为了解决这个问题,我浏览了 Kinesis 的开发人员指南和 AWS 文档http://docs.aws.amazon.com/kinesis/latest/dev/kinesis-record-processor-implementation-app-java.html。
我想知道是否可以从两个不同的流中获取数据并相应地处理它。
假设我有两个不同的 Streamsstream1
和stream2
.
是否可以分别从流和进程中获取数据?
我正在尝试制作 Kinesis 消费者客户端。为了解决这个问题,我浏览了 Kinesis 的开发人员指南和 AWS 文档http://docs.aws.amazon.com/kinesis/latest/dev/kinesis-record-processor-implementation-app-java.html。
我想知道是否可以从两个不同的流中获取数据并相应地处理它。
假设我有两个不同的 Streamsstream1
和stream2
.
是否可以分别从流和进程中获取数据?
为什么不?从两个流中获取记录。
如果您的流每个只有一个分片,您还将看到所有事件,因为建议使用单个工作人员处理每个分片,但如果您的逻辑以某种方式加入来自不同源/流的事件,您可以实现它一个工作人员从两个流中读取。
请注意,如果您有具有多个分片的流,则您的每个工作人员将只能看到部分事件。您可以有以下选项:
两个流都有一个分片 - 在这种情况下,您可以使用单个工作人员从 bout 流中读取并查看两个流中的所有事件。您可以添加时间戳或其他键以允许您在工作程序中“加入”这些事件。
一个带有一个分片的流 ( stream1 ) 和带有多个分片的第二个流 ( stream2 ) - 在这种情况下,您可以从所有工作人员的stream1中读取,这也将分别处理来自stream2的单个分片。您的每个工作人员都将看到 stream1 的所有事件及其在stream2事件中的份额。请注意,您可以使用单个分片(2MB/秒或 5 次读取/秒)从stream1读取事件的速度有限制,如果您在stream2中有许多分片,这可能是一个真正的限制。
两个流都可以有多个分片——在这种情况下,确保您能够“加入”这些事件会更加复杂,因为您需要将写入和读取同步到这些流。您还可以使用单个工作人员从两个流的所有分片中读取,但这不是一个好习惯,因为它限制了您的扩展能力,因为您不再拥有分布式系统。另一种选择是在两个流中使用相同的partition_key,并且对两个流具有相同数量的分片和分区定义,并验证您正在从每个工作人员的每个流中读取“正确”分片,并且您每次您的一名工作人员出现故障并重新启动时,都会正确执行此操作,这可能有点复杂。
您可以考虑的另一种选择是将两种类型的事件写入单个流中,再次使用相同的partition_key,然后如果您需要以不同方式处理它们(例如,将它们写入不同的日志文件),则在读取器端过滤它们在 S3 中)。