当前位置: 首页 > 知识库问答 >
问题:

如何将运动流中的碎片分配给运动消费者的多个实例?

聂炜
2023-03-14

我有一个带有20个碎片的动觉流的设置,该碎片由基于KCL的动觉消费者消费。消费者部署在ECS中,有20个实例。(指多个KCL实例?)

我相信在这种情况下会发生的是:

  • 每个实例将为每个分片创建20个工作线程,相互独立。
  • 所以在任何给定的时间,一个分片都会有20个独立的线程连接到它
  • 每个实例都会处理相同的记录集(即:不会跨实例处理重复的记录处理)
  • 这也将超过每个分片的消费者速率限制。(每秒5笔交易)
  • 运行我的消费者的单个实例就足够了。换句话说,跨多个实例扩展消费者根本没有任何好处。

这个答案似乎表明“分片租约”将确保它只由单个实例处理。但是,这里的第二个答案说“KCL实例每个分片只会启动一个进程,但是您可以让另一个KCL实例使用相同的流(和分片),假设第二个具有权限。”。

此外,这个留档建议“将实例数量增加到打开分片的最大数量”作为一种可能的扩展方法,这与上述一些观点相矛盾。

在这种情况下,消费者实例实际上是如何工作的?

共有1个答案

宇文航
2023-03-14

在您描述的场景中会发生的情况是,20个工作人员中的每一个最终只会处理1个分片。

在启动时,每个工作人员都会试图通过为这些碎片创建租约来声明尽可能多的碎片。当所有20名员工同时开始工作时,他们都会尝试为20个碎片创建租约,但这不会对所有人都成功。一个工人可能会得到5块碎片,而另一个工人可能会得到2块或3块碎片。不过,经过几次租用迭代后,每个工作人员应该只有1个碎片。这样,AWS费率限制就得到了遵守。

当这种平衡过程发生时,两个工人可能会在短时间内处理相同的记录两次。这发生在一个工作人员从另一个工作人员处窃取租约和该工作人员尝试更新租约以及通过定期刷新或检查点发现另一个工作人员已获取租约之间。

不过,在最初的租赁划分之后,这种情况将不再发生。当工人重新开始工作时,他们会恢复以前的租约。但当一名工人长期失业时,其他工人将接管其租约。

因此,动觉有一个至少一次的处理模型。最好设计应用程序,使对数据的操作是幂等的。

如果您想要容错(其他工作人员将接替失败的工作人员),或者您的数据处理非常耗时,以至于一个工作人员无法处理20个碎片,那么缩放非常有用。超出碎片数量的扩展实际上只对容错目的有用。

 类似资料:
  • 我已经读过一些关于动画片和多个消费者的问题,但我仍然不明白它是如何工作的。 我的用例:我有一个只有一个分片的运动流。我想使用不同的lambda函数使用这个分片,每个函数都独立。就像每个lambda函数都有自己的分片迭代器一样。 有可能吗?是否设置多个lambda使用者(基于流)从同一流/碎片读取?

  • TL;DR;我试图理解一个被分配了多个分区的单个使用者是如何处理reach分区的消费记录的。 例如: 在移动到下一个分区之前,会完全处理一个分区。 每次处理每个分区中的可用记录块。 从第一个可用分区处理一批N条记录 以循环旋转方式处理来自分区的N条记录 我找到了或分配程序的配置,但这只决定了使用者如何分配分区,而不是它如何从分配给它的分区中使用。 我开始深入研究KafkaConsumer源代码,#

  • 我了解到,每个kinesis流可以有多个消费者应用程序。 http://docs.aws.amazon.com/kinesis/latest/dev/developing-consumers-with-kcl.html 但是,我听说你只能在每个分片的消费者上有。这是真的吗?我找不到任何留档来支持这一点,我无法想象如果多个消费者从同一个流中阅读会是什么样子。当然,这并不意味着生产者需要为不同的消费者

  • 如果在创建Kinesis数据流时,我指定了碎片的数量,比如说10个,并且每次我放入记录时,我都会给它分配一个随机分区键,如下所示: kinesis将如何决定将记录放入某个碎片中,如果唯一分区键的数量大于碎片的数量,会发生什么情况?

  • 我正在以每秒350次的速度向DynamoDB表写入数据。我已经在其上启用了流,并配置了多个消费者来读取每个碎片。每个消费者只能处理100条记录/秒,这意味着我需要至少4个消费者处理流。问题是,当写入数/秒增加时,DynamoDB不会创建多个碎片。想知道DynamoDB在什么时候开始创建多个碎片(写入数/秒的值) 我曾尝试在每秒100到350次写入之间写入表 如何触发多个碎片,从文档中可以看出,没有

  • 我读过很多关于这方面的文章,但也有2012年或更早的文章。 (我只是打算从数据库中读取和插入一些数据。)