上下文:我不一定是指基于KCL的应用程序,只是纯粹的Kinesis API调用。
使用TRIM_HORIZON
分片迭代器类型是否会立即为您提供流中最早发布的记录(即最早在Kinesis内置的24小时窗口中可用),或者只是迭代器/光标一段时间内就像24小时前一样,你必须沿着溪流前进,直到你达到最早公布的纪录?
换句话说,如果不太清楚......
当使用分片迭代器类型TRIM_HORIZON
时,它是以24小时前返回的记录开始的预期行为,但是如果在24小时之前发布了零记录,那么只有3几个小时前,您的应用程序需要在它达到3小时前发布的记录之前的前21个小时内进行迭代轮询?
时间轴示例:
GetShardIterator
调用TRIM_HORIZON
作为您的分片迭代器类型,然后与该分片迭代器发出GetRecords
调用并接收记录“Item = A“GetShardIterator
调用TRIM_HORIZON
作为您的分片迭代器类型,然后使用该分片迭代器发出GetRecords
调用。 此调用的结果应该是什么? (注意:我们不记得/重新使用第3步中的分片迭代器) 对于上面的步骤5,自从“Item = A”消息在流上发布以来已超过24小时,并且自“Item = B”发布以来只有一分钟。使用TRIM_HORIZON
的新鲜分片迭代器会立即为您提供最早的可用记录,或者您是否需要继续迭代直到您发布某些内容的时间段?
我一直在试验Kinesis,一切都在昨天或两天前工作正常(即我出版和消费没有任何问题)。我对我的代码做了一些额外的修改,并于今天再次开始发布。当我解雇我的消费者时,即使让它运行几分钟也没有任何东西出现。我尝试在同一时间发布和消费,但仍然没有。手动播放AFTER_SEQUENCE_NUMBER
迭代器类型,并使用几天前我的消费者日志中的一些序列号后,我能够访问我最近发布的消息。但是如果我回到使用TRIM_HORIZON
类型,我根本看不到任何消息。
我查看了docs,但是我发现的大多数文档都假设您使用的是KCL(我实际上最初使用的是KCL,但是当它开始失败时我退回到原始API调用)并提及您必须具有应用程序名称,并且DynamoDB表用于跟踪状态。如果您使用的是纯粹的Kinesis API调用或Kinesis CLI,那么我最好能说的是这两种情况,我最终都试过这两种情况。我终于编写了一个纯API脚本,以TRIM_HORIZON
开头并无限制地进行轮询,并最终达到了新的记录(花费了大约600次迭代;现在开始了14小时后的“现在”,并且在“现在”后面大约5小时后找到了记录)。如果这是预期的行为,似乎wording in the docs只是有点混乱/误导:
TRIM_HORIZON - 开始读取分片中最后一条未修剪的记录 在系统中,这是分片中最旧的数据记录。
我认为(现在似乎不正确)术语“最旧的数据记录”意味着我已经发布到流中的记录,而不仅仅是流中的时间段。
如果有人可以帮助确认/解释我所看到的行为,那就太好了。
谢谢!
答案 0 :(得分:0)
它位于TRIM HORIZON,或流TRIMming发生的HORIZON。
调用时,分片迭代器可能会获得0条记录,因此您需要继续迭代以到达最旧记录所在的区域(如果您不经常推送到流中或有时间间隔)。 getRecords将为您提供可用于迭代的下一个分片迭代器。
来自doc的: http://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetRecords.html
如果碎片部分中没有可用的记录,那么 迭代器指向,GetRecords返回一个空列表。请注意它 可能需要多次调用才能获得碎片的一部分 包含记录。
答案 1 :(得分:0)
TRIM_HORIZON提供流中最早的记录。
就在有时将TRIM_HORIZON作为shard_iterator_type: -
Suppose the value of "millis_behind_latest" in the kinesis response is ~86399000 & your stream retention period is 24 hours(86400000)
当您使用shard_iterator检索记录时,记录不再位于流中,因为已超出记录的保留期。因此,您得到一个空的结果,因为最旧的记录已过期而不再存在于数据流中。所以shard_iterator现在指向磁盘中的空白区域。
当发生这样的事情时,取" next_shard_iterator"的值。并使用get_records再次获取kinesis数据记录。
另外一件事是我们并不完全了解AWS如何管理数据流中的每个分片。数据如何被删除并添加到其中。也许数据不会存储在并发/连续的内存块中,因此我们会在检索数据之间得到空的结果。
继续使用" next_shard_iterator"并使用get_records,直到#34; millis_behind_latest"的值为0。
希望这个答案有所帮助。 :)