【问题标题】:How are shards from a Kinesis stream assigned to multiple instances of a Kinesis consumer?如何将 Kinesis 流中的分片分配给 Kinesis 使用者的多个实例?
【发布时间】:2020-09-05 10:56:30
【问题描述】:

我有一个带有 20 个分片的 kinesis 流设置,供基于 KCL 的 kinesis 消费者使用。消费者部署在 ECS 中,有 20 个实例。(意思是多个 KCL 实例?)

我认为在这种情况下会发生的是:

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

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

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

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

【问题讨论】:

    标签: amazon-web-services sharding producer-consumer amazon-kinesis


    【解决方案1】:

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

    在启动时,每个工作人员将尝试通过为这些分片创建租约来声明尽可能多的分片。当所有 20 个工作人员同时启动时,他们都会尝试为 20 个分片创建租约,但这不会对所有人都成功。一个工作人员可能最终得到例如 5 个分片,而其他工作人员则有 2 或 3 个。但是,经过几次租约迭代后,每个工作人员应该只有 1 个分片。这样就可以遵守 AWS 速率限制。

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

    不过,在最初的租赁分割之后,这种情况就不会再发生了。当工人重新启动时,他们会恢复以前的租约。但是当一个工人长时间停机时,其他工人将接管它的租约。

    因此,Kinesis 具有至少一次处理模型。最好设计您的应用程序,以便对数据的操作是幂等的。

    如果您想要容错(其他工作人员将从失败的工作人员那里接管),或者您的数据处理非常耗时以至于一个工作人员无法处理 20 个分片,那么扩展非常有用。超出分片数量的扩展确实仅用于容错目的。

    【讨论】:

    • 谢谢,这很有意义!我有个问题。 “不过,经过几次租约迭代后,每个工人应该只有 1 个分片。”这是否意味着每个实例最终都会处理 1 个分片?
    • 我还遇到了另一个相关问题,我认为需要单独提出一个与 getRecords 调用相关的问题。你能看看吗? stackoverflow.com/questions/63772135/…
    • 是的,如果有 20 个分片和 20 个工人,最终每个工人将有 1 个分片。如果你有两个工人,他们每个人会得到 10 个碎片。对于奇数个分片(例如 21 个),一个将获得 10 个,另一个将获得 11 个。
    猜你喜欢
    • 2016-04-02
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多