来自 Kinesis 流的分片如何分配给 Kinesis 消费者的多个实例?

How are shards from a Kinesis stream assigned to multiple instances of a Kinesis consumer?

我有一个带有 20 个分片的运动流的设置,由基于 KCL 的运动消费者使用。消费者部署在具有 20 个实例的 ECS 中。(意味着多个 KCL 实例?)

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

answer seem to suggest that the "shard's lease" would ensure that it is only processed by a single instance. However, the 此处表示“一个 KCL 实例将只为每个分片启动一个进程,但您可以让另一个 KCL 实例使用相同的流(和分片),前提是第二个实例具有权限。”。

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

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

在你描述的场景中会发生什么是 20 个工人中的每一个最终只会处理 1 个分片。

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

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

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

Kinesis 因此有一个 at-least-once 处理模型。最好设计您的应用程序,以便对数据的操作是幂等的。

如果您想成为 fault-tolerant(其他工作人员将接替失败的工作人员)或者您的数据处理如此 time-consuming 以至于一个工作人员无法应对,则缩放很有用20个碎片。扩展超过分片数量确实仅对 fault-tolerance 有用。