Обрабатывать ошибки в лямбдах, вызванных SQS с batchSize> 1 - PullRequest
0 голосов
/ 04 июня 2019

Я установил очередь AWS SQS, которая запускает лямбда-функцию.В качестве поведения по умолчанию лямбда может быть запущена с 10 сообщениями одновременно (по умолчанию batchSize).

Если лямбда выходит из строя по какой-либо причине, то произойдет сбой всего пакета и, в конце концов, будет повторена попытка.Но, скажем, у меня есть лямбда, отправляющая электронную почту, она успешно выполняется для N первых случаев, но не работает в N + 1.Если он повторяет всю партию, он дублирует электронные письма.

В настоящее время я могу думать только о создании batchSize 1, чтобы избежать этой проблемы, но я надеялся избежать ее.Есть ли другой способ сделать это?

Код узла очень прост, что-то вроде этого:

exports.handler = async event => {
  try {
    await Promise.all(
      event.Records.map(async record => {
        // SEND EMAIL ASYNC
      });
    );
  } catch (error) {
    [...];
    throw error;
  }
}

1 Ответ

0 голосов
/ 04 июня 2019

Один из способов обойти это - отслеживать, какие сообщения были успешными, а какие - нет (сделано в вашей функции карты), и в разделе catch повторно добавлять сообщения, которые не удалось (можно найти с помощью ReceiptHandle), в очередь , Затем вместо того, чтобы выдать ошибку, вернитесь успешно, что приведет к удалению всего пакета из очереди.

Я полагаю, что обратное удаление удачных сообщений с deleteMessageBatch и ReceiptHandle и выдача ошибки, чтобы остальная часть пакета не очищалась автоматически, могла бы работать, но я не пытался удалять сообщения в полете.

С https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html

Когда Lambda читает сообщение из очереди, оно остается в очереди, но становится скрытым, пока Lambda не удалит его. Если ваша функция возвращает ошибку или не завершает обработку до истечения времени ожидания видимости очереди, она снова становится видимой.

...