0

我想为数据发送制作以下架构。

生产者 --> Kinesis 数据流 --> 消费者

消费者服务器可以关闭,因此我认为至少应该有 2 个消费者。这样对吗?

当一个数据流有两个消费者时,有没有办法处理每个消费者的一半数据?据我所知,没有办法。如果每个消费者消费相同的数据,那就是浪费时间和成本。因为我只为高可用性创建了 2 个消费者。(用于故障转移)

在 web-was 架构中,ELB 或 L4 可以通过负载均衡帮助将一半的数据发送到每个 was 服务器。

我想知道运动数据流的类似方式。

4

1 回答 1

2

当一个数据流有两个消费者时,有没有办法处理每个消费者的一半数据?据我所知,没有办法。

你错了。

您应该阅读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
于 2019-10-31T12:25:34.177 回答