Kinesis客户端库记录处理器故障

时间:2017-11-01 13:46:45

标签: amazon-web-services amazon-dynamodb amazon-kcl

根据AWS docs

  

worker使用Java ExecutorService任务调用记录处理器方法。如果任务失败,则工作程序将保留对记录处理器正在处理的分片的控制。工作人员启动新的记录处理器任务来处理该分片。有关更多信息,请参阅读取限制。

根据AWS文档中的another page

  

Kinesis客户端库(KCL)依赖于您的processRecords代码   处理因处理数据记录而产生的任何异常。任何   processRecords引发的异常被KCL吸收。避免   在重复出现故障时无限次重试,KCL不会重新发送   异常时处理的批记录。 KCL然后   调用processRecords用于下一批数据记录而不用   重新启动记录处理器。这有效地导致了消费者   应用程序观察跳过的记录。为了防止跳过记录,   正确处理processRecords中的所有异常。

这两个矛盾的陈述不是吗?一个说记录处理器重新启动,另一个说碎片被跳过。 当记录处理器出现故障时,KCL究竟做了什么? KCL工作人员如何知道记录处理器是否失败?

1 个答案:

答案 0 :(得分:4)

根据我编写,调试和支持基于KCL的应用程序的经验,第二个语句更清晰/准确/有用,用于描述您应该如何考虑错误处理。

首先,有点背景知识:

  • KCL记录处理旨在从多个主机运行。假设您有3个主机和12个分片要处理 - 每个主机运行一个工作程序,并将拥有4个分片的处理。
  • 如果在处理其中一个分片期间抛出异常,KCL将吸收异常并将其视为处理所有记录 - 有效地“跳过”任何未处理的记录。
    • 请记住,这是您抛出异常的代码,因此您可以在它转移到KCL之前处理它
  • 当KCL工作人员本身失败/停止时,这些分片将被转移给另一名工作人员。例如,如果您缩小到两个主机,那么第三个工作人员正在处理的4个分片将被转移到另外两个主机。

第一个声明是尝试(不是很清楚)说 KCL任务失败时,该工作者的实例将控制它正在处理的分片(而不是将它们转移给另一个工人。)