通过 lambda 重新排队收到 SQS 消息
Requeue received SQS message through lambda
有效方法:使用适用于 .Net 的 AWS-SQS SDK,我能够接收消息批处理并在消息可见性计时器内删除单个消息 window。我也不能做任何事情并有效地重新排队消息,如果重新排队达到配置的次数,该消息就会变成死信。
什么不起作用:我正在尝试使用 Lambda 做同样的事情。我创建了一个触发器,这意味着 SQS 触发 lambda 向它发送一批消息。发生这种情况时,这些消息似乎会自动从队列中删除。我无法控制删除单个消息或将其重新排队。
在 lambda 中抛出异常似乎使批处理中的所有消息都保留在队列中。有没有更优雅的方法来做到这一点,还有没有办法对单个消息而不是整个批次进行此操作?
当您使用 SQS Lambda Trigger 时,如果处理成功,您的消息将自动从队列中删除。
如果需要,您可以轮询来自 SQS 的消息,而不是让消息触发您的 Lambda。为此,只需不要为您的 Lambda 函数配置触发器并让它通过 Cloud Watch Event 每 X 时间执行一次。在每次执行时,您将轮询 SQS 队列以获取新消息。我真的不明白你为什么要这样做,因为触发和自动删除消息非常方便。如果您想将失败的消息发送到 DLQ,只需在源 SQS 队列本身上设置 DLQ。然后您可以自定义 maxReceiveCount
,一旦达到此阈值,消息将转到配置的 DLQ。
来自文档:
If a message fails processing multiple times, Amazon SQS can send it
to a dead letter queue. Configure a dead letter queue on your source
queue to retain messages that failed processing for troubleshooting.
Set the maxReceiveCount on the queue's redrive policy to at least 5 to
avoid sending messages to the dead letter queue due to throttling.
将批量大小设置为 1,如果要重新排队则抛出异常。
有效方法:使用适用于 .Net 的 AWS-SQS SDK,我能够接收消息批处理并在消息可见性计时器内删除单个消息 window。我也不能做任何事情并有效地重新排队消息,如果重新排队达到配置的次数,该消息就会变成死信。
什么不起作用:我正在尝试使用 Lambda 做同样的事情。我创建了一个触发器,这意味着 SQS 触发 lambda 向它发送一批消息。发生这种情况时,这些消息似乎会自动从队列中删除。我无法控制删除单个消息或将其重新排队。
在 lambda 中抛出异常似乎使批处理中的所有消息都保留在队列中。有没有更优雅的方法来做到这一点,还有没有办法对单个消息而不是整个批次进行此操作?
当您使用 SQS Lambda Trigger 时,如果处理成功,您的消息将自动从队列中删除。
如果需要,您可以轮询来自 SQS 的消息,而不是让消息触发您的 Lambda。为此,只需不要为您的 Lambda 函数配置触发器并让它通过 Cloud Watch Event 每 X 时间执行一次。在每次执行时,您将轮询 SQS 队列以获取新消息。我真的不明白你为什么要这样做,因为触发和自动删除消息非常方便。如果您想将失败的消息发送到 DLQ,只需在源 SQS 队列本身上设置 DLQ。然后您可以自定义 maxReceiveCount
,一旦达到此阈值,消息将转到配置的 DLQ。
来自文档:
If a message fails processing multiple times, Amazon SQS can send it to a dead letter queue. Configure a dead letter queue on your source queue to retain messages that failed processing for troubleshooting. Set the maxReceiveCount on the queue's redrive policy to at least 5 to avoid sending messages to the dead letter queue due to throttling.
将批量大小设置为 1,如果要重新排队则抛出异常。