【问题标题】:Getting Data from two different Streams in Kinesis?从 Kinesis 中的两个不同流中获取数据?
【发布时间】:2015-05-07 12:42:37
【问题描述】:

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

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

假设我有两个不同的流 stream1stream2

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

【问题讨论】:

    标签: amazon-web-services amazon-kinesis


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 感谢您的详细解释。在想太多之后我想如果无论如何我可以只使用一个流和在 processRecords 步骤中为两个流发送数据,我会将它们隔离,这不是一个好主意吗?
    • 是的。这是一个更简单且可扩展的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 2020-06-25
    • 2019-08-06
    • 2014-07-11
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多