gpt4 book ai didi

java - 解释 Kinesis 碎片迭代器 - AWS Java SDK

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:40 25 4
gpt4 key购买 nike

好的,我将从详细的用例开始并解释我的问题:

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

我的问题 是我检索到的数据不一致并且没有时间顺序上的逻辑。

  • 当我使用 AT_SEQUENCE_NUMBER 并使用

    提供分片中的第一个序列号时

    .getSequenceNumberRange().getStartingSequenceNumber();

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

  • 当我使用 LATEST 时,得到的结果为零;
  • 当我使用 TRIM_HORIZON 时,使用起来应该很有意义,但它似乎工作不正常。它曾经为我提供数据,然后我添加了新的“事件”(记录到最终流)并且我收到了零记录。谜团。

我的问题是:

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

提前致谢,我真的很想了解更多有关 Kinesis 流数据消耗的信息。

最佳答案

我理解上面的困惑,我也有同样的问题,但我想我现在已经弄明白了。请注意,我使用的是 JSON API直接不用 KCL。

我似乎在客户端开始使用流时,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 迭代器中。

上面确实意味着如果你想实时读取所有已知的过去记录和 future 记录,你必须使用 A 和 B 的组合,逻辑来处理中间的记录(最近的过去)。 KCL 很可能会解决这个问题。

关于java - 解释 Kinesis 碎片迭代器 - AWS Java SDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25890937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com