当一个数据流有两个消费者时,有没有办法处理每个消费者的一半数据?据我所知,没有办法。
你错了。
您应该阅读Kinesis 开发人员指南或更具体地https://docs.aws.amazon.com/streams/latest/dev/kinesis-record-processor-scaling.html。
运动流由 1 个或多个分片组成。每个分片都可以独立处理。
引用上述链接中的示例,
以下示例说明了 KCL 如何帮助您处理缩放和重新分片:
例如,如果您的应用程序在一个 EC2 实例上运行,并且正在处理一个具有四个分片的 Kinesis 数据流。这个实例有一个 KCL 工作者和四个记录处理器(每个分片一个记录处理器)。这四个记录处理器在同一进程中并行运行。
接下来,如果您扩展应用程序以使用另一个实例,您将有两个实例处理一个具有四个分片的流。当 KCL 工作程序在第二个实例上启动时,它会与第一个实例进行负载平衡,因此每个实例现在处理两个分片。
如果您随后决定将四个分片分成五个分片。KCL 再次协调跨实例的处理:一个实例处理三个分片,另一个处理两个分片。合并分片时会发生类似的协调。
您只需确保两个 Kinesis Consumer 应用程序(在不同机器上运行)都配置有相同的应用程序名称。KCL 跟踪应用程序名称、分片检查点作为 Dynamo DB 表。此 dynamo db 表还用于定义使用者应用程序之间分片的所有权。
因此,如果您有一个具有 4 个分片的 Kinesis Stream 和两个在不同机器上运行的消费者应用程序。然后分片平衡将通过以下方式完成。
----Shard1---> application-instance-1
----Shard2---> application-instance-1
----Shard3---> application-instance-2
----Shard4---> application-instance-2
假设application-instance-1
下跌。然后application-instance-2
将开始处理所有分片。
----Shard1---> application-instance-2
----Shard2---> application-instance-2
----Shard3---> application-instance-2
----Shard4---> application-instance-2