当前位置: 首页 > 知识库问答 >
问题:

AWS Kinesis ShardIteratorType TRIM_HORIZON的预期行为

花阳辉
2023-03-14

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

使用trim_horizonshard迭代器类型是否立即为您提供流中最早发布的记录(即在Kinesis内置的24hr窗口中可用的最早记录),或者仅仅是一个迭代器/光标,您必须使用它沿着流前进,直到找到最早发布的记录?

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

  1. 9月29日5:00上午-创建一个带有1个碎片的流“foo”
  2. 9月29日5:02上午-将单个记录“item=a”发布到“foo”流
  3. 9月29日5:03上午-使用trim_horizon作为碎片迭代器类型发出getShardIterator调用,然后使用该碎片迭代器发出getRecord调用并接收记录“item=a”
  4. 9月30日7:02上午-发布第二条记录“item=b”到“foo”流
  5. 9月30日上午7:03-使用Trim_Horizon作为碎片迭代器类型发出GetShardIterator调用,然后使用该碎片迭代器发出GetRecord调用。这个电话的结果应该是什么?(注意:我们没有记住/重用步骤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次迭代;在“now”后面14小时开始,在“now”后面大约5小时发现记录)。如果这是意料之中的行为,那么文档中的措辞似乎有点令人困惑/误导:

trim_horizon-从系统中碎片中最后一条未修剪的记录开始读取,这是碎片中最古老的数据记录。

我假设(现在看来是错误的)术语“最古老的数据记录”是指我已经发布到流中的记录,而不仅仅是流中的一个时间段。

共有1个答案

万修为
2023-03-14

它在修剪地平线上,或者是发生溪流修剪的地平线上。

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

来自doc:http://docs.aws.amazon.com/kinesis/latest/apireference/api_getrecords.html

 类似资料:
  • 我有一个选择一个图像的意图(我在一个片段中这样称呼它): 在我的活动中: 输出:OnActivityResult:请求代码:66084 OnActivityResult:Result:-1成功=true 正如您所看到的,结果是成功的,但请求代码发生了更改。所以我无法查证是什么请求。

  • 问题内容: 我正在尝试学习Go,但是坚持使用以下语言:http : //ideone.com/hbCamr或http://ideone.com/OvRw7t 对于此输入: 输出为: 这是预期的行为吗?为什么它不像C ++ getline一样起作用?http://ideone.com/Wx8z5o 问题答案: 答案在以下文档中: Scanln与Scan相似,但是在换行符处停止扫描,并且在最后一个项目

  • 在实用服务中,我有两个功能foo和bar。js 在我的测试文件中,我导入了实用ervice.js并窥探了条形图函数。我期望调用间谍计数为1,因为foo被称为,但它是0。如果我错过了什么,请建议。

  • 我的要求是有基于磁盘的缓存。如果缓存内存已满,我希望将LRU元素推送到磁盘。然后,如果磁盘上的文件已满,我希望驱逐磁盘上的LRU元素。这是一个非常简单的要求,但是我无法使用EhCache来实现。 我使用EhCache(2.10.1)进行以下配置: 我的期望是,当缓存被填满时(即缓存大小超过50M),我希望将LRU元素推送到文件中,从而为内存中的新元素创建一些空间。 然而,这不是EhCache的工作

  • 我在Spring Boot项目中使用Resilience4J调用REST客户机,如下所示: 看到示例中包含了一个回退方法,我决定添加它,尽管我并不真的想调用不同的方法,我只想再次调用我的原始方法。 不管怎样,我指定了一个回落: 现在,我看到回退方法被重试,但是每次都会抛出HttpServerErrorException,这意味着使用者将收到一个异常作为对其调用的响应。 谢谢