我想在数据发送方面采用以下架构。
生产者-> Kinesis数据流->消费者
可以关闭消费服务器,因此我认为应该至少有2个消费服务器。 是吗?
当一个数据流有两个使用者时,是否有任何方法可以处理每个使用者一半的数据?据我所知,这是不可能的。 如果每个消费者使用相同的数据,那将浪费时间和成本。 因为我只为2个消费者提供高可用性。 (用于故障转移)
在网络架构中, 通过负载平衡,ELB或L4可以帮助向每个服务器发送一半的数据。
我想知道运动学数据流的类似方法。
答案 0 :(得分:0)
当一个数据流有两个使用者时,有什么方法可以 每个消费者处理一半的数据?据我所知,这是不可能的。
你错了。
您应该经历Kinesis Developer guide或更具体地说https://docs.aws.amazon.com/streams/latest/dev/kinesis-record-processor-scaling.html。
运动学流由1个或多个碎片组成。每个分片可以是 独立处理。
引用以上链接中的示例
以下示例说明了KCL如何帮助您进行扩展 和重新分片:
例如,如果您的应用程序在一个EC2实例上运行,并且 正在处理一个包含四个分片的Kinesis数据流。这个 实例有一个KCL工作程序和四个记录处理器(一个记录 每个碎片的处理器)。这四个记录处理器运行在 在同一过程中并行进行。
接下来,如果您扩展应用程序以使用另一个实例,则可以 两个实例处理一个具有四个分片的流。当KCL worker在第二个实例上启动,它与 第一个实例,因此每个实例现在都可以处理两个分片。
如果您随后决定将四个碎片分成五个碎片。 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