【问题标题】:Does Event Source Mapping (For AWS MSK-Lambda) send messages to dead letter queue in aws lambda?事件源映射(适用于 AWS MSK-Lambda)是否将消息发送到 aws lambda 中的死信队列?
【发布时间】:2022-09-29 19:22:47
【问题描述】:
我使用 AWS MSK(Apache Kafka 托管流服务)作为 lambda 函数的触发器。我有一个零秒的窗口和一个批量大小。
我观察到,在从 MSK 轮询消息后,从 lambda 服务调用 lambda 函数是同步的;这意味着只要 lambda 执行不成功,它就不会将消息提交回分区。在 lambda 的配置中,在异步调用下,我将 message expiration 配置为 6 小时,将 retries 配置为 2。我观察到的是,尽管只要消息未提交回 lambda,就会重试主题分区只要 lambda 执行成功,但即使在 6 小时后,我也无法在集合 dead letter queue 中看到任何消息。
第一次轮询的消息会发生什么,为什么在异步调用部分配置的消息过期时间之后,lambda服务没有将此消息发送到配置的SQS DLQ?
在 AWS 文档here 中,它说只要消息未成功处理或过期,lambda 就会重试。
这是否意味着 lambda 的 MSK 触发器是完全同步的,并且如果未配置队列,则永远不会隐式地将消息发送到死信队列或在过期后将其丢弃?
标签:
amazon-web-services
asynchronous
aws-lambda
synchronous
aws-msk
【解决方案1】:
所以玩了一圈后我想通了,完全是同步操作。它是如何工作的,只要 lambda 执行不成功并成功完成,即没有任何错误,则不会提交当前偏移量。
此外,此分区的此偏移量之外不会有任何并发操作。 AWS lambda 的内部服务负责处理它。
来自 kafka 的任何东西都是基于投票的操作,而不是推送。因此,称为事件源映射的内部服务会根据您在配置中提供的批次大小和批次编号从分区轮询事件。然后它调用 lambda 函数。
它等待执行成功完成,一旦 lambda 被正确执行,它会提交这个偏移量并轮询另一个偏移量并调用 lambda。
我无法弄清楚,您可以在哪里使用 lambda 代码手动提交偏移量。相反,如果您希望少数特定错误不妨碍您的管道并且偏移量应该不断出现,您需要在异常中巧妙地处理它。
如果异常块没有引发/或者您的代码没有引发任何运行时/错误,则执行将成功并且将提交偏移量,并且您将继续接收新的偏移量。但是巧妙地设计你的应用程序,只要你不知道错误或不知道你将如何处理它,lambda 失败也很重要。
此外,这种方式的消息不会过期,并且事件源映射会一次又一次地轮询相同的消息,这不会写入死信队列。
希望这会有所帮助,请随时在评论中写下进一步的查询/问题/建议。