使用 SQS 队列的 lambda 函数如何将消息发送到死信队列?
How can a lambda function that consumes a SQS queue send the message to a Dead Letter Queue?
我有一个 AWS lambda 函数,它使用来自 AWS SQS 队列的数据。如果此 lambda 在处理消息数据时发现问题,则必须将此消息添加到死信队列中。
我找到的文档并不清楚如何让 lambda 将消息发送到死信队列。这是如何实现的?
我应该像插入标准队列那样使用 sendMessage() 方法,还是有更好的方法?
您不应该将消息发送到死信队列,处理失败次数过多的消息将自行到达那里,请参阅 here
重点是你收到消息,失败,不要删除它,maxReceiveCount
次后它将重新驱动到 DLQ。
请注意,您可以简单地将它发送到 DLQ(由 documentation 提示,看看它说的地方 The NumberOfMessagesSent and NumberOfMessagesReceived for a Dead-Letter Queue Don't Match
),但至少对我来说这似乎是一种滥用。
TLDR:您不应该自己发送,队列需要配置 DLQ,亚马逊会在一定数量的失败后为您完成。
如果 receiveMessage
returns 消息发送次数过多(可在队列上配置 maxReceiveCount
属性) - 如果您收到一条消息但不删除它(例如,如果您在处理它时遇到一些异常),通常会发生这种情况。这是使用 DLQ 的最简单方法 - 让 AWS 为您放置消息。
但是,手动向 DLQ 发送消息没有任何问题。它没有什么特别的——它只是另一个队列——你可以从它发送和接收消息,甚至给它自己的 DLQ!
手动向 DLQ 发送消息在多种情况下很有用,最简单的一种是您的情况:当您知道消息已损坏(并希望节省尝试重新处理它的时间)时。另一个例子是,如果您需要快速销毁主队列中的旧项目,但仍然保存这些消息以供以后处理 - 使您能够通过先处理更新的事件来赶上积压。
手动向 DLQ 发送消息时要记住的关键事项是:
- 首先将消息发送到队列
- 将消息标记为已在原始队列中使用(使用
deleteMessage
),这样 AWS 的自动机制以后就不会为您将其放在那里。
- 如果先从原始队列中删除消息,则消息丢失的可能性很小(即:如果在将消息存储到别处之前崩溃或出错)
我有一个 AWS lambda 函数,它使用来自 AWS SQS 队列的数据。如果此 lambda 在处理消息数据时发现问题,则必须将此消息添加到死信队列中。
我找到的文档并不清楚如何让 lambda 将消息发送到死信队列。这是如何实现的?
我应该像插入标准队列那样使用 sendMessage() 方法,还是有更好的方法?
您不应该将消息发送到死信队列,处理失败次数过多的消息将自行到达那里,请参阅 here
重点是你收到消息,失败,不要删除它,maxReceiveCount
次后它将重新驱动到 DLQ。
请注意,您可以简单地将它发送到 DLQ(由 documentation 提示,看看它说的地方 The NumberOfMessagesSent and NumberOfMessagesReceived for a Dead-Letter Queue Don't Match
),但至少对我来说这似乎是一种滥用。
TLDR:您不应该自己发送,队列需要配置 DLQ,亚马逊会在一定数量的失败后为您完成。
如果 receiveMessage
returns 消息发送次数过多(可在队列上配置 maxReceiveCount
属性) - 如果您收到一条消息但不删除它(例如,如果您在处理它时遇到一些异常),通常会发生这种情况。这是使用 DLQ 的最简单方法 - 让 AWS 为您放置消息。
但是,手动向 DLQ 发送消息没有任何问题。它没有什么特别的——它只是另一个队列——你可以从它发送和接收消息,甚至给它自己的 DLQ!
手动向 DLQ 发送消息在多种情况下很有用,最简单的一种是您的情况:当您知道消息已损坏(并希望节省尝试重新处理它的时间)时。另一个例子是,如果您需要快速销毁主队列中的旧项目,但仍然保存这些消息以供以后处理 - 使您能够通过先处理更新的事件来赶上积压。
手动向 DLQ 发送消息时要记住的关键事项是:
- 首先将消息发送到队列
- 将消息标记为已在原始队列中使用(使用
deleteMessage
),这样 AWS 的自动机制以后就不会为您将其放在那里。- 如果先从原始队列中删除消息,则消息丢失的可能性很小(即:如果在将消息存储到别处之前崩溃或出错)