我想为数据发送制作以下架构。
生产者 --> Kinesis 数据流 --> 消费者
消费者服务器可以关闭,因此我认为至少应该有 2 个消费者。这样对吗?
当一个数据流有两个消费者时,有没有办法处理每个消费者的一半数据?据我所知,没有办法。如果每个消费者消费相同的数据,那就是浪费时间和成本。因为我只为高可用性创建了 2 个消费者。(用于故障转移)
在 web-was 架构中,ELB 或 L4 可以通过负载均衡帮助将一半的数据发送到每个 was 服务器。
我想知道运动数据流的类似方式。
我想为数据发送制作以下架构。
生产者 --> Kinesis 数据流 --> 消费者
消费者服务器可以关闭,因此我认为至少应该有 2 个消费者。这样对吗?
当一个数据流有两个消费者时,有没有办法处理每个消费者的一半数据?据我所知,没有办法。如果每个消费者消费相同的数据,那就是浪费时间和成本。因为我只为高可用性创建了 2 个消费者。(用于故障转移)
在 web-was 架构中,ELB 或 L4 可以通过负载均衡帮助将一半的数据发送到每个 was 服务器。
我想知道运动数据流的类似方式。
当一个数据流有两个消费者时,有没有办法处理每个消费者的一半数据?据我所知,没有办法。
你错了。
您应该阅读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