我想为数据发送做下面的架构。
生产者->动态数据流->消费者
消费者服务器可以关闭,因此我认为至少应该有两个消费者。是对的吗?
当一个数据流有两个使用者时,是否有任何方法来处理每个使用者一半的数据?据我所知,没有办法。如果每个消费者使用相同的数据,那就是浪费时间,浪费成本。因为我只为高可用性做了两个消费者。(用于故障转移)
在was体系结构中,ELB或L4可以通过负载平衡将一半数据发送到每个was服务器。
我想知道类似的运动数据流的方法。
发布于 2019-10-31 12:25:34
当一个数据流有两个使用者时,是否有任何方法来处理每个使用者一半的数据?据我所知,没有办法。
你错了。
您应该通过动态开发人员指南或者更确切地说是https://docs.aws.amazon.com/streams/latest/dev/kinesis-record-processor-scaling.html。
运动流由一个或多个碎片组成。每个碎片都可以独立处理。
引用上述链接中的例子,
下面的示例说明了KCL如何帮助您处理缩放和重定向: 例如,如果您的应用程序运行在一个EC2实例上,并且正在处理一个包含四个碎片的Kinsis数据流。这一个实例有一个KCL工作程序和四个记录处理器(每个碎片有一个记录处理器)。这四个记录处理器在同一个进程中并行运行。 接下来,如果将应用程序缩放为使用另一个实例,则有两个实例处理一个具有四个碎片的流。当KCL工作人员在第二个实例上启动时,它将与第一个实例进行负载平衡,以便每个实例现在处理两个碎片。 如果你决定把这四个碎片分成五个碎片。KCL再次协调跨实例的处理:一个实例处理三个碎片,另一个实例处理两个碎片。合并碎片时也会发生类似的协调。
您只需确保两个(运行在不同的机器上)都配置了相同的应用程序名。KCL跟踪应用程序名称,并将检查点分解为Dynamo DB表。此dynamo表还用于定义使用者应用程序之间的碎片的所有权。
因此,如果您有一个带有4个碎片和两个在不同机器上运行的消费者应用程序的Kinesis。然后,碎片平衡将按以下方式进行。
----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-2https://stackoverflow.com/questions/56218877
复制相似问题