我想在下面的结构中进行数据发送。
生产者-> Kinesis数据流->消费者
消费者服务器可以关闭,因此我认为应该至少有2个消费者。是吗?
[当一个数据流有两个使用者时,是否有任何方法可以处理每个使用者一半的数据?据我所知,这是不可能的。如果每个消费者使用相同的数据,那将浪费时间和成本。因为我只为2个消费者提供高可用性。 (用于故障转移)
在网络架构中,通过负载平衡,ELB或L4可以帮助向每个was服务器发送一半数据。
我想知道运动学数据流的类似方法。
[当一个数据流有两个使用者时,有什么方法可以每个消费者处理一半的数据?据我所知,这是不可能的。
您错了。
您应阅读Kinesis Developer guide,或更具体地说是https://docs.aws.amazon.com/streams/latest/dev/kinesis-record-processor-scaling.html。
运动学流由1个或多个碎片组成。每个分片可以是独立处理。
从以上链接引用示例,
以下示例说明了KCL如何帮助您进行扩展和重新分片:
例如,如果您的应用程序在一个EC2实例上运行,并且正在处理一个包含四个分片的Kinesis数据流。这个实例有一个KCL工作程序和四个记录处理器(一个记录每个碎片的处理器)。这四个记录处理器运行在在同一过程中并行。
接下来,如果您缩放应用程序以使用另一个实例,两个实例处理一个具有四个分片的流。当KCLworker在第二个实例上启动,它与第一个实例,因此每个实例现在都可以处理两个碎片。
如果您随后决定将四个碎片分成五个碎片。 KCL再次协调跨实例的处理:一个实例处理三个分片,另一个处理两个分片。一个相似的合并碎片时会发生协调。
您只需要确保两个Kinesis Consumer应用程序(在不同的计算机上运行)都配置了相同的应用程序名称。 KCL会将应用程序名称,分片检查点作为Dynamo DB表进行跟踪。此dynamo db表还用于定义使用者应用程序之间的分片所有权。
因此,如果您的Kinesis Stream具有4个分片和两个在不同计算机上运行的消费者应用程序。然后分片平衡将通过以下方式完成。
----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