如何在几个记录处理器之间平衡kinesis分片?

时间:2017-09-11 15:30:14

标签: go amazon-ec2 load amazon-kinesis amazon-kcl

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

我读到Java KCL实现了这一点,但我无法在库中找到实现。我的问题是如何在Golang中实现此功能?谢谢。

3 个答案:

答案 0 :(得分:1)

KCL已为您进行负载均衡。

以下是今天如何运作的基本描述(请记住,这只是基础知识,并且随着亚马逊改进逻辑而有所变化):

  • 当一个工作者(可能处理多个分片)启动时,它会检查一个中央DynamoDB数据库,其中工作者拥有分片(必要时创建该数据库)。这是"租赁"表。
    • A" lease"是工人和碎片之间的关系
    • 工作人员将处理其拥有未到期租约
    • 的分片的记录
    • 如果工人没有发出"心跳,则租约到期。对于租约到期之前(通常每隔几秒钟) - 这个心跳基本上更新了DDB记录
  • 它会检查可用分片的Kinesis流,并在需要时更新表
  • 如果任何租约过期,工人将尝试取得租约的所有权 - 在数据库级别,使用shardId作为密钥并在那里写下它的workerId。
  • 如果一名工人已经开始并且所有分片都已被采用,它会检查"余额"是 - 如果它检测到不平衡(即:"我拥有0个分片,而另一些工人拥有10个分片"),它会启动一个"窃取分片" protocol - 旧工作程序停止处理该分片,新工作程序启动

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

在撰写本文时,它不支持租借盗用:https://github.com/vmware/vmware-go-kcl/issues/4