上下文:我不一定指的是基于KCL的应用程序,只是纯粹的Kinesis API调用.
使用分片TRIM_HORIZON迭代器类型是否会立即为您提供流中最早发布的记录(即最早在Kinesis内置的24小时窗口中可用),或者只是迭代器/光标在24小时之前的一段时间内,然后必须使用沿着溪流前进,直到你达到最早公布的记录?
换句话说,如果不太清楚......
当使用shard迭代器类型时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类型,我根本看不到任何消息.
我查看了文档,但是我发现的大多数文档都假设您使用的是KCL(我实际上最初使用的是KCL,但是当它开始失败时我退回到原始API调用)并提到您必须拥有应用程序名称并且DynamoDB表用于跟踪状态.如果您使用的是纯粹的Kinesis API调用或Kinesis CLI,那么我最好能说的是这两种情况,我最终都试过这两种情况.我终于编写了一个纯API脚本,开始TRIM_HORIZON并无限制地进行轮询,并最终创造了新的记录(花了大约600次迭代;开始14小时后"现在",并在"现在"落后约5小时后找到记录).如果这是预期的行为,似乎文档中的措辞只是有点混乱/误导:
TRIM_HORIZON - 开始读取系统中分片中最后一条未修剪的记录,该记录是分片中最旧的数据记录.
我假设(现在似乎不正确)术语"最旧的数据记录"意味着我已经发布到流中的记录,而不仅仅是流中的时间段.
如果有人可以帮助确认/解释我所看到的行为,那就太棒了.
谢谢!