AWS Kinesis ShardIteratorType TRIM_HORIZON的预期行为

jum*_*and 10 amazon-web-services amazon-kinesis

上下文:我不一定指的是基于KCL的应用程序,只是纯粹的Kinesis API调用.

使用分片TRIM_HORIZON迭代器类型是否会立即为您提供流中最早发布的记录(即最早在Kinesis内置的24小时窗口中可用),或者只是迭代器/光标在24小时之前的一段时间内,然后必须使用沿着溪流前进,直到你达到最早公布的记录?

换句话说,如果不太清楚......

当使用shard迭代器类型时TRIM_HORIZON,它是预期的行为,它将以24小时前返回的记录开始,但如果零记录是在24小时之前发布的,而是仅在3小时前发布,那么您的应用程序将需要在它达到3小时前发布的记录之前,通过前21个小时进行迭代轮询?

时间线示例:

  1. 9月29日上午5:00 - 创建一个带有1个分片的流"foo"
  2. 9月29日上午5:02 - 将单个记录"Item = A"发布到"foo"流
  3. 9月29日上午5:03 - GetShardIterator使用TRIM_HORIZON您的分片迭代器类型发出一个GetRecords调用,然后使用该分片迭代器发出一个调用并接收记录"Item = A"
  4. 9月30日上午7:02 - 将第二条记录"Item = B"发布到"foo"流
  5. 9月30日上午7:03 - GetShardIterator使用TRIM_HORIZON您的分片迭代器类型发出一个GetRecords调用,然后使用该分片迭代器发出一个调用.这次电话会产生什么结果呢? (注意:我们不记得/重用第3步中的分片迭代器)

对于上面的步骤5,自从"Item = A"消息在流上发布以来已超过24小时,并且自"Item = B"发布以来只有一分钟.一个新的碎片迭代器会TRIM_HORIZON立即为您提供最早的可用记录,或者您是否需要继续迭代直到您发布某些内容的时间段?

我一直在试验Kinesis,一切都在昨天或两天前工作正常(即我出版和消费没有任何问题).我对我的代码做了一些额外的修改,并于今天再次开始发布.当我解雇我的消费者时,即使让它运行几分钟也没有任何东西出现.我尝试在同一时间发布和消费,但仍然没有.手动播放AFTER_SEQUENCE_NUMBER迭代器类型,并使用几天前我的消费者日志中的一些序列号后,我能够访问我最近发布的消息.但是如果我回到使用该TRIM_HORIZON类型,我根本看不到任何消息.

我查看了文档,但是我发现的大多数文档都假设您使用的是KCL(我实际上最初使用的是KCL,但是当它开始失败时我退回到原始API调用)并提到您必须拥有应用程序名称并且DynamoDB表用于跟踪状态.如果您使用的是纯粹的Kinesis API调用或Kinesis CLI,那么我最好能说的是这两种情况,我最终都试过这两种情况.我终于编写了一个纯API脚本,开始TRIM_HORIZON并无限制地进行轮询,并最终创造了新的记录(花了大约600次迭代;开始14小时后"现在",并在"现在"落后约5小时后找到记录).如果这是预期的行为,似乎文档中措辞只是有点混乱/误导:

TRIM_HORIZON - 开始读取系统中分片中最后一条未修剪的记录,该记录是分片中最旧的数据记录.

我假设(现在似乎不正确)术语"最旧的数据记录"意味着我已经发布到流中的记录,而不仅仅是流中的时间段.

如果有人可以帮助确认/解释我所看到的行为,那就太棒了.

谢谢!

Mir*_*cea 1

它位于 TRIM HORIZON(修剪水平线)或发生流修剪的水平线(HORIZON)。

分片迭代器在调用时可能会获得 0 条记录,因此您需要继续迭代以到达最旧记录所在的区域(如果您不经常推送到流或有时间间隙)。getRecords 将为您提供可用于迭代的下一个分片迭代器。

来自文档: http ://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetRecords.html

如果迭代器指向的分片部分中没有可用记录,则 GetRecords 将返回一个空列表。请注意,可能需要多次调用才能访问包含记录的分片部分。