1

我目前正在用 Golang 版本编写简单的 Kinesis Client Library (KCL)。我希望它用于我的简单 KCL 的功能之一是跨多个记录处理器和 EC2 实例的负载平衡分片。例如,我有两个记录处理器(将在单独的 EC2 实例中运行)和四个 Kinesis 分片。负载平衡功能将允许每个记录处理器处理两个 Kinesis 分片

我读到 Java KCL 实现了这个,但我在库中找不到实现。我的问题是我将如何在 Golang 中实现此功能?谢谢你。

4

3 回答 3

7

KCL 已经为您做了负载平衡。

以下是它今天如何工作的基本描述(请记住,这只是基础知识,随着亚马逊改进逻辑可能会发生变化):

  • 当工作人员(可能处理多个分片)启动时,它会检查一个中央 DynamoDB 数据库,其分片归工作人员所有(必要时创建该数据库)。这是“租赁”表。
    • “租约”是工人和分片之间的关系
    • 工作人员将处理其拥有未到期租约的分片记录
    • 如果工作人员在租约到期之前(通常每隔几秒)没有为租约发出“心跳”,则租约过期 - 这个心跳实质上会更新 DDB 记录
  • 它检查 Kinesis 流中哪些分片可用,并在需要时更新表
  • 如果任何租约过期,worker 将尝试获取租约的所有权 - 在数据库级别,使用 shardId 作为 key 并将其写入 workerId 那里。
  • 如果一个工人启动并且所有分片都已经被占用,它会检查“平衡”是什么 - 如果它检测到不平衡(即:“我拥有 0 个分片,而其他一些工人拥有 10 个分片”),它会启动“窃取” shard" 协议 - 旧工作人员停止处理该分片,新工作人员开始

您当然可以在 github 上查看 KCL 的源代码:https ://github.com/awslabs/amazon-kinesis-client - 希望这个解释为您提供更多关于如何理解 KCL 并使其适应您的需求的背景信息.

于 2017-11-05T17:53:20.843 回答
0

在您开始编写自己的客户端之前......看起来有些人已经这样做了:

您拥有的另一个选项是 KCL MultiLangDaemon。您可以安装一个小型运行程序来为您完成所有平衡,然后您只需听取守护程序发送给您的消息并将它们提交回来。

https://github.com/awslabs/amazon-kinesis-client#amazon-kcl-support-for-other-languages

于 2017-09-13T18:50:18.183 回答
0

对于对该主题感兴趣的人,VMWare 编写了 Java lib 的 Go 实现:https ://github.com/vmware/vmware-go-kcl/

但是,在撰写本文时,它不支持租约窃取:https ://github.com/vmware/vmware-go-kcl/issues/4

于 2019-09-05T12:28:07.887 回答