Лямбда-функция не повторяет обработку сообщений sqs в случае, если код Java вызывает исключение runtimeException - PullRequest
0 голосов
/ 28 марта 2019

У меня есть лямбда-функция, написанная на Java, которая прослушивает события sqs и пытается выполнить некоторую обработку этих сообщений sqs.

Согласно лямбда-документации, если лямбда-код генерирует исключение runtimeException, то лямбда дважды повторяет одно и то же сообщение, прежде чем отправить его обратно в очередь. Однако я не вижу такого поведения. Я вижу, как он обрабатывает сообщение только один раз.

В данном случае приведен фрагмент соответствующего лямбда-кода.

@Override
    public Boolean handleRequest(SQSEvent sqsEvent, Context context) {

          try{
               ........some queue message processing.....
          }
          catch(Exception ex){
               throw new RuntimeException("exception occurred");
          }

}

Разве этого недостаточно, чтобы лямбда повторил сообщение еще 2 раза? Я проверил cloudwatch, чтобы увидеть, какие лямбда-логи регистрируются, и он просто имеет логи только с самой первой обработки, а не повторных попыток.

Может кто-нибудь сказать мне, что я здесь упустил, из-за чего он не работает, как ожидалось.

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Вам не хватает предложения throws в handleRequest.Если у вас этого нет, лямбда просто проглотит исключение

public Boolean handleRequest(SQSEvent sqsEvent, Context context) throws RuntimeException

Кроме того, то, что Фалес Мунусси сказал вам о синхронном опросе, абсолютно правильно.Когда вы перехватываете sqs с помощью lambda, lambda опрашивает sqs, который сохраняет открытое соединение между ними, и, следовательно, делает его синхронным. Согласно документации aws, lambda не повторяет попытки в таких синхронных случаях.Настройка dlq и самого выхода в sqs - ваш лучший выходsqs сгенерирует одно и то же событие на основе номера повторного вызова.

Если лямбда не может успешно обработать количество раз, то сообщение отправляется в DLQ из основной очереди

0 голосов
/ 28 марта 2019

В документации говорится, что повторяется еще два раза, если вызов асинхронный . SQS - это система, основанная на опросах. Лямбда будет опрашивать очередь, и все ее вызовы будут синхронными .

Для сервисов AWS на основе опросов (Amazon Kinesis, Amazon DynamoDB, Amazon Простая служба очереди), AWS Lambda опрашивает поток или очередь сообщений и синхронно вызывает вашу лямбда-функцию.

Что вы можете сделать, это настроить DLQ в исходной очереди SQS в случае сбоя вашего сообщения, чтобы вы могли либо продолжить его анализ, либо снова обработать сообщение на основе настроенной вами логики.

EDIT

ОП почему-то не может видеть сообщения в DLQ. Я приложил изображения, чтобы показать, что это работает.

Лямбда-sqs-тест запускается новым сообщением в очереди SQS sqs-test

Это очереди (sqs-test-dlq настроен как DLQ для sqs-test).

enter image description here

Это код для лямбда-функции:

enter image description here

Это конфигурация для sqs-test

enter image description here

И это политика переадресации

enter image description here

После сбоя сообщений в функции Lambda они были успешно отправлены на настроенный DLQ:

enter image description here

Возможно, вам не хватает какой-то базовой конфигурации, потому что она работает без проблем, как показано на изображениях выше.

...