将 kinesis shard-iterator-type 设置为 LATEST 是否有在 lambda 中丢失消息的风险?
Does setting a kinesis shard-iterator-type to LATEST risk losing messages in lambda?
我们正在尝试为我们的 lambda 确定最好的 shard-iterator-type
,但我得到了关于分片迭代器类型功能的混合信息 AFTER 一个 lambda 已经首次部署。
有人告诉我,如果我们使用 shard-iterator-type
of LATEST
,当我们去部署更新版本的 lambda 时,我们将丢失消息,因为 lambda 总是拉取最多来自 kinesis 的最新消息,并将忽略它在部署时未处理的消息。
我的问题是:这是正确的吗?
是的,没错。
当您的应用程序开始使用 LATEST
迭代器类型读取时,它将从下一条记录开始读取。所以所有已经在队列中的数据都会被忽略。这意味着如果您的应用有停机时间 - 停机期间的每条消息都将被跳过。
您可以通过保存您的应用读取的最新消息的序列号然后使用 AFTER_SEQUENCE_NUMBER
迭代器类型并提供保存的序列号来解决这个问题。就像一个检查站。
如果您的 lambda 是第一次部署(没有保存之前的序列号),您可能想从以下任一开始:
TRIM_HORIZON
- 从读取队列中最早的数据开始。如果您有大量数据和较长的保留期,可能会有点太多
LATEST
- 从下一条收到的消息开始阅读
我们正在尝试为我们的 lambda 确定最好的 shard-iterator-type
,但我得到了关于分片迭代器类型功能的混合信息 AFTER 一个 lambda 已经首次部署。
有人告诉我,如果我们使用 shard-iterator-type
of LATEST
,当我们去部署更新版本的 lambda 时,我们将丢失消息,因为 lambda 总是拉取最多来自 kinesis 的最新消息,并将忽略它在部署时未处理的消息。
我的问题是:这是正确的吗?
是的,没错。
当您的应用程序开始使用 LATEST
迭代器类型读取时,它将从下一条记录开始读取。所以所有已经在队列中的数据都会被忽略。这意味着如果您的应用有停机时间 - 停机期间的每条消息都将被跳过。
您可以通过保存您的应用读取的最新消息的序列号然后使用 AFTER_SEQUENCE_NUMBER
迭代器类型并提供保存的序列号来解决这个问题。就像一个检查站。
如果您的 lambda 是第一次部署(没有保存之前的序列号),您可能想从以下任一开始:
TRIM_HORIZON
- 从读取队列中最早的数据开始。如果您有大量数据和较长的保留期,可能会有点太多LATEST
- 从下一条收到的消息开始阅读