当AWS KCL processRecords失败时,如何"标记"记录应该重新处理?

时间:2017-03-27 12:50:45

标签: java aws-sdk amazon-dynamodb-streams amazon-kcl

我正在使用AWS DynamoStream,他的API基于AWS KCL。

如果我收到了我未能处理的记录,我希望以后可以使用这些记录来重新处理它们。例如,我试图将它们保存到远程数据库,并且有时会遇到网络问题。

我的问题是:

  1. 我能否以某种方式使用Checkpointer来表明我没有处理记录?
  2. 我应该避免执行Checkpointer.checkpoint()吗?如果我仍然在processRecords
  3. 的下次通话中使用它,它会有效吗?
  4. 我可以为此目的使用任何例外吗?

1 个答案:

答案 0 :(得分:1)

KCL不提供这种内置的重新启动机制 - 一旦processRecords返回(无论是抛出异常还是成功返回),它都会将这些记录视为已处理并继续运行,即使内部失败也是如此。

如果你想稍后重新处理一些记录,你需要捕获这些记录并将它们存储在其他地方,以便稍后进行再处理(明显需要注意的是,它们不会按照其余的顺序进行处理流)。

最简单的解决方案是让您的记录处理器逻辑识别失败的记录(在返回KCL之前)并将它们发送到SQS队列。然后,记录不会丢失,它们可供您休闲处理(或由消耗SQS队列的其他进程处理,可能使用DLQ机制处理重复故障/放弃方案)。

回答您的具体问题:

  1. 不。检查点只是说"我已经走到了这一步,不在检查站前看东西"
  2. 将检查点视为全球状态。一旦设定,它就包含了之前的所有内容。您也不需要检查每次调用processRecords的时间 - 您可以每X秒执行一次,或者每隔Y个记录执行一次。
  3. 不是KCL级别 - 您可以在内部使用特殊的异常类型,并在返回Kinesis之前在processRecords的外层捕获它。或者您可以捕获所有异常 - 它取决于您以及您希望如何使用重新驱动逻辑。