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

7
根据AWS文档,工作程序使用Java ExecutorService任务调用记录处理器方法。如果任务失败,工作程序将保留记录处理器正在处理的分片的控制权,并启动一个新的记录处理器任务来处理该分片。有关更多信息,请参阅读取限制。
根据AWS文档中的另一页,Kinesis客户端库(KCL)依赖于您的processRecords代码来处理处理数据记录时出现的任何异常。从processRecords抛出的任何异常都会被KCL吸收。为避免在经常发生故障时进行无限重试,KCL不会重新发送在出现异常时处理的记录批次。然后,KCL为下一批数据记录调用processRecords,而不重新启动记录处理器。这实际上导致消费者应用程序观察到跳过的记录。为了防止跳过记录,请适当地处理processRecords中的所有异常。
这两个语句不是矛盾的吗?一个说记录处理器重新启动,另一个说分片被跳过。当记录处理器失败时,KCL到底做了什么?KCL工作程序如何知道记录处理器失败?
1个回答

9

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

首先,一些背景知识:

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

第一个语句试图(不太清楚)表明 KCL任务失败时,实例的工作程序将保留其正在处理的分片的控制权(而不将其转移给另一个工作程序)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接