Java 当AWS KCL processRecords失败时,如何;标记“;这些记录应该重新处理吗?

Java 当AWS KCL processRecords失败时,如何;标记“;这些记录应该重新处理吗?,java,aws-sdk,amazon-dynamodb-streams,amazon-kcl,Java,Aws Sdk,Amazon Dynamodb Streams,Amazon Kcl,我正在与AWS DynamoStream合作,他的API基于AWS KCL 如果我收到了无法处理的记录,我希望这些记录稍后可用,以便重新处理。例如,我试图将它们保存到一个远程数据库中,我有时会遇到网络问题 我的问题是: 我能否以某种方式使用检查点来表示我没有处理记录 我应该避免执行Checkpointer.checkpoint()吗?如果我在下一次调用processRecords时仍使用它,它会有任何影响吗 我是否可以为此目的使用任何例外情况 KCL不提供这种内置的重新驱动机制——一旦proce

我正在与AWS DynamoStream合作,他的API基于AWS KCL

如果我收到了无法处理的记录,我希望这些记录稍后可用,以便重新处理。例如,我试图将它们保存到一个远程数据库中,我有时会遇到网络问题

我的问题是:

  • 我能否以某种方式使用检查点来表示我没有处理记录
  • 我应该避免执行Checkpointer.checkpoint()吗?如果我在下一次调用
    processRecords
    时仍使用它,它会有任何影响吗
  • 我是否可以为此目的使用任何例外情况

  • KCL不提供这种内置的重新驱动机制——一旦processRecords返回(无论是抛出异常还是成功返回),它会将这些记录视为已处理并继续,即使在内部失败

    如果您想在以后重新处理某些记录,则需要捕获这些记录并将其存储到其他地方,以便稍后进行重新处理尝试(但有一个明显的警告,即不会按照流其余部分的顺序处理这些记录)

    最简单的解决方案是让您的记录处理器逻辑识别失败的记录(在返回KCL之前),并将其发送到SQS队列。这样,记录就不会丢失,并且可以在您空闲时进行处理(或者由另一个使用SQS队列的进程执行,可能使用DLQ机制来处理重复故障/放弃场景)

    要回答您的具体问题:

  • 不,检查点只是说“我已经走了这么远,不要在检查点之前看东西”
  • 把检查点想象成一个全局状态。一旦设置好了,它就包含了之前的所有内容。你也不需要检查对processRecords的每次调用——你可以每X秒检查一次,或者每Y次检查一次,等等
  • 不在KCL级别—您可以在内部使用特殊的异常类型,并在返回到Kinesis之前在processRecords的外部级别捕获该异常。或者您可以捕获所有异常—这取决于您以及您希望对redrive逻辑的具体程度