消耗SQS队列的lambda函数如何将消息发送到死信队列?

时间:2019-01-28 18:46:42

标签: javascript node.js amazon-web-services aws-lambda amazon-sqs

我有一个AWS lambda函数,该函数使用来自AWS SQS队列的数据。如果此lambda在处理消息的数据时发现问题,则必须将该消息添加到死信队列中。

我发现的文档不清楚如何使lambda将消息发送到Dead Letter Queue。如何实现的?

是否应该像在标准队列中插入一样使用sendMessage()方法,还是有更好的方法?

2 个答案:

答案 0 :(得分:0)

您不应将邮件发送到死信队列,处理次数过多的邮件将自行到达那里,请参见here

重点是您收到消息,然后处理失败,不要删除它,并且经过maxReceiveCount次之后,它将重新驱动到DLQ。

请注意,您可以简单地将其发送到DLQ(documentation的提示下显示The NumberOfMessagesSent and NumberOfMessagesReceived for a Dead-Letter Queue Don't Match的位置),但是至少对我来说这似乎是一种滥用。

TLDR:您不应该自己发送它,该队列需要配置DLQ,Amazon会在发生一定次数的故障后为您执行此操作。

答案 1 :(得分:0)

如果receiveMessage多次返回该消息(可以在队列中使用maxReceiveCount属性进行配置),AWS将自动为您发送消息到您的dead-letter-queue (DLQ)-通常,如果您收到消息,但不要删除它(例如,如果您在处理它时遇到一些例外)。这是使用DLQ的最简单方法-通过让AWS在其中为您放置消息。

但是,手动将消息发送到DLQ没什么问题。没什么特别的-它只是另一个队列-您可以从中发送和接收消息,甚至可以给它自己的DLQ!

在几种情况下,将消息手动发送到DLQ很有用,最简单的情况就是您的情况:当您知道消息已损坏(并希望节省时间来重新处理它)时。另一个示例是,如果您需要快速清除主队列中的旧项目,但仍保留这些消息以供以后处理-使您能够通过首先处理更多近期事件来赶上积压。

手动向DLQ发送消息时要记住的关键事项是:

  1. 先将消息发送到队列
  2. 将消息标记为已在原始队列中使用(使用deleteMessage),以便AWS的自动机制以后不再为您放置消息。
    • 如果您首先从原始队列中删除消息,则消息丢失的可能性很小(即:如果在将消息存储到其他位置之前崩溃或出错)