繁体   English   中英

解释Kinesis Shard Iterator - AWS Java SDK

[英]Explain Kinesis Shard Iterator - AWS Java SDK

好的,我将从精心设计的用例开始,并解释我的问题:

  1. 我使用第三方网站分析平台,该平台利用AWS Kinesis流将数据从客户端传递到最终目的地 - 一个Kinesis流;
  2. 网站分析平台使用2个流:
    1. 数据收集器流(单个分片流);
    2. 第二个流,用于丰富来自收集器流的原始数据(单个分片流); 最重要的是,此流使用TRIM_HORIZON迭代器类型从第一个流中消耗原始数据;
  3. 我使用AWS Java SDK从流中使用数据,使用GetShardIteratorRequest类;
  4. 我正在开发提取类,所以这是同步完成的,这意味着我只在编译类时才使用数据;
  5. 该类令人惊讶地工作,虽然有一些我无法理解的东西,特别是关于如何从流中消耗数据以及每个迭代器类型的含义;

我的问题是我检索的数据不一致,并且没有按时间顺序排列的逻辑。

  • 当我使用AT_SEQUENCE_NUMBER并从分AT_SEQUENCE_NUMBER提供第一个序列号时

    。.getSequenceNumberRange()getStartingSequenceNumber();

    ......作为``,我没有得到所有记录。 同样, AFTER_SEQUENCE_NUMBER ;

  • 当我使用LATEST ,我的结果为零;
  • 当我使用TRIM_HORIZON ,它应该有意义使用,它似乎没有正常工作。 它曾经为我提供数据,然后我添加了新的“事件”(记录到最后一个流),我收到了零记录。 神秘。

我的问题是:

  1. 如何安全地使用流中的数据,而不必担心错过记录?
  2. 是否有ShardIteratorRequest的替代方案?
  3. 如果有,我怎么才能“浏览”流并查看其中的内容以进行调试引用?
  4. 我对TRIM_HORIZON方法缺少什么?

在此先感谢,我真的很想从Kinesis流中学到更多关于数据消耗的知识。

我理解上面的困惑,我遇到了同样的问题,但我想我现在已经弄明白了。 请注意,我在没有KCL的情况下直接使用JSON API

我似乎API在客户端开始使用流时为客户端提供了两种基本选择:

A)TRIM_HORIZON:用于读取延迟数分钟(甚至数小时)和24小时之间的PAST记录。 它最近没有返回记录。 在此迭代器看到的最后一条记录上使用AFTER_SEQUENCE_NUMBER即使记录最近为PUT,也会返回一个空数组。

B)LATEST:实时读取FUTURE记录(在PUT之后立即)。 我被这篇文章的唯一一句话所欺骗,就是在“碎片中最近的记录之后开始阅读,以便你总是阅读碎片中的最新数据。” 你得到一个空数组,因为获得迭代器后没有PUT记录。 如果你得到这种类型的迭代器,然后PUT一条记录,该记录将立即可用。

最后,如果您知道最近放置记录的序列ID,则可以使用AT_SEQUENCE_NUMBER立即获取它,并且您可以使用AFTER_SEQUENCE_NUMBER获取以后的记录,即使它们不会出现在TRIM_HORIZON迭代器中。

上述内容确实意味着如果您想要实时读取所有已知的过去记录和未来记录,则必须使用A和B的组合,并使用逻辑来处理两者之间的记录(最近的过去)。 KCL可能很顺利。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM