【问题标题】:TRIM_HORIZON vs LATESTTRIM_HORIZON vs LATEST
【发布时间】:2026-02-05 03:20:12
【问题描述】:

我在AWS Kinesis 的正式文档中找不到TRIM_HORIZON 和检查点之间的任何显式引用,以及LATEST 和检查点之间的任何引用。

你能证实我的理论吗:

  • TRIM_HORIZON - 如果应用程序名称是新的,那么我将读取流中所有可用的记录。否则,application-name 已被使用,那么我将从 my 上一个检查点读取。

  • LATEST - 如果应用程序名称是新的,那么我将读取流中添加的所有记录 我订阅了溪流。否则,应用程序名称已被使用,我将读取来自 my 上一个检查点的消息。

  • TRIM_HORIZONLATEST 之间的区别仅在于应用程序名称是新的情况。

【问题讨论】:

  • 这两个答案都不能清楚地说明这是否仅在您第一次创建源映射时才重要,或者您丢失了 LATEST 处于稳定状态的数据。

标签: amazon-web-services aws-sdk amazon-kinesis amazon-kcl


【解决方案1】:

AT_TIMESTAMP

-- 来自特定的时间戳

TRIM_HORIZON

-- Kinesis 流中所有可用消息从头开始(与最早在 Kafka 中相同)

最新

--来自最新消息,即刚刚进入 Kinesis/Kafka 的当前消息以及从那时起的所有传入消息 onwords

【讨论】:

  • “来自最新消息”是什么意思?相反的顺序?你能扩展一下吗?
  • 不是倒序,而是跳过消息从“现在”开始并向前移动(想法是流不断接收新数据,您可以将其用作追赶机制,但代价是数据丢失)
  • 最新消息是指刚刚进入 Kinesis 的当前消息。因此消费者开始使用该消息中的消息以及进入 Kinesis 的任何未来消息
  • @Krease 当您说数据丢失的费用时,是指我们最初设置事件源映射的时间,还是在您将太多数据推送到发电机/ kinesis 和 lambda 处理速度很慢,并且仅通过在我们设置事件源映射后跳过进入流的未处理记录来获取最新记录?
  • @iamprem - 这只是一种跳过记录的机制 - 说您的处理非常落后(即一个小时),您可以跳过那个小时(丢失记录)并开始处理最近的记录。这在数据新近度比数据完整性更重要的情况下最有用。
【解决方案2】:

来自GetShardIterator documentation(这符合我使用 Kinesis 的经验):

请求中可以指定分片迭代器类型AT_TIMESTAMP从任意时间点读取记录,TRIM_HORIZON使ShardIterator指向系统分片中最后一条未修剪的记录(最旧的数据)分片中的记录),或LATEST,以便您始终读取分片中的最新数据。

基本上,区别在于您是想从最旧的记录 (TRIM_HORIZON) 开始,还是从“现在”开始(LATEST - 在最新检查点和现在之间跳过数据)。

【讨论】:

  • 这似乎不正确。 TRIM_HORIZON 将读取最旧的,无论是否“已处理”。
【解决方案3】:

问题清楚地询问了这些选项与检查点的关系。但是,现有的答案都没有解决检查点。

Justin Pfifer 对这个问题的权威回答出现在 GitHub 问题 here

最相关的部分是

KCL 将始终使用租用表中的值(如果存在)。请务必记住,Kinesis 本身不会跟踪消费者的位置。跟踪由租约表提供。 KCL 服务器中的租赁双重职责。它们提供互斥和位置跟踪。因此,为了互斥,需要创建一个租约,并且为了满足位置跟踪,必须选择一个初始值。

(我添加的重点。)

【讨论】:

  • 上述最佳答案。