将分片拆分为2个子分片时,父分片将关闭。正如以下KCL源代码所示,预计记录处理器(此处使用的KCL)会在检测到这一点时显示:
try {
recordProcessor.shutdown(recordProcessorCheckpointer, reason);
String lastCheckpointValue = recordProcessorCheckpointer.getLastCheckpointValue();
if (reason == ShutdownReason.TERMINATE) {
if ((lastCheckpointValue == null)
|| (!lastCheckpointValue.equals(SentinelCheckpoint.SHARD_END.toString()))) {
throw new IllegalArgumentException("Application didn't checkpoint at end of shard "
+ shardInfo.getShardId());
}
}
问题是:
此检查点是否必不可少?
如果记录处理器没有检查点并吸收异常会怎样?
我问的原因是因为在我的用例中我想确保流中的每条记录都已经处理成s3,现在如果碎片被关闭,可能还有一些项尚未刷新,因此我想确保他们会对孩子碎片的新消费者/工作者感到不满?
如果我检查点,他们不会被重新发送。
有什么想法吗?
提前谢谢。答案 0 :(得分:4)
项目不在分片之间移动。重新分片后,新记录将被放入新分片中,但旧记录永远不会从父分片传输,也不会再向(现已关闭)父分片添加新记录。即使关闭后,数据仍会在父级分片中保持24小时的正常生命周期。您的记录处理器只有在从父分片到达数据末尾后才会关闭。
http://docs.aws.amazon.com/kinesis/latest/dev/kinesis-using-sdk-java-after-resharding.html
顺便说一下,你可能知道SDK API很难,而且客户端库也不是很好。尝试使用连接器库,这是一个更好的API,并包含一个S3归档应用程序的示例。