Как мне отказать в конкретном сообщении SQS в пакете от лямбды? - PullRequest
1 голос
/ 03 апреля 2019

У меня есть лямбда с триггером SQS. Когда в него попадают, приходит партия записей из SQS (обычно около 10 за раз, я думаю). Если я верну ошибочный код состояния из обработчика, все 10 сообщений будут повторены. Если я верну код успеха, все они будут удалены из очереди. Что делать, если одно из этих 10 сообщений не удалось, и я хочу повторить попытку только этого?

exports.handler = async (event) => {

    for(const e of event.Records){
        try {
            let body = JSON.parse(e.body);
            // do things
        }
        catch(e){
            // one message failed, i want it to be retried
        }        
    }

    // returning this causes ALL messages in 
    // this batch to be removed from the queue
    return {
        statusCode: 200,
        body: 'Finished.'
    };
};

Нужно ли мне вручную добавлять эти сообщения обратно в очередь? Или я могу вернуть статус из моего обработчика, который указывает, что одно сообщение не удалось и его следует повторить?

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Да, вам нужно вручную повторно добавить сообщения об ошибках обратно в очередь.

Я предлагаю сделать настройку счетчика ошибок, чтобы в случае сбоя всех сообщений вы могли просто вернуть статус ошибки длявсе сообщения, в противном случае, если число сбоев <10, вы можете отправлять сообщения с ошибками в очередь по отдельности. </p>

0 голосов
/ 03 апреля 2019

Вам нужно разработать свое приложение иначе, вот несколько идей, которые не являются лучшими, но решат вашу проблему.

Решение 1:

  • Создание очереди доставки sqs - sq1
  • Создание очередей задержки в соответствии с требованием задержки sq2
  • Создать очередь мертвых писем sdl
  • Теперь внутри лямбда-функции, если сообщение не удалось в sq1, удалите его в sq1 и поместите в sq2 для повторения. Любая лямбда-функция, вызываемая асинхронно, повторяется дважды, прежде чем событие отбрасывается. Если повторные попытки не удаются.

  • Если снова произойдет сбой после повторной попытки, перейдите в очередь недоставленных сообщений sdl.

Примечание. Если исходное сопоставление источника событий SQS изначально создано и включено или впервые появляется после периода без трафика, служба Lambda начнет опрос очереди SQS с использованием пяти параллельных соединений с длинным опросом, согласно документации AWS. длительность по умолчанию для длинного опроса от AWS Lambda до SQS составляет 20 секунд.

Решение 2:

Использование AWS StepFunction

StepFunction будет вызывать лямбду и обрабатывать логику повторения в случае сбоя с настраиваемым экспоненциальным отступом, если это необходимо.

** Решение 3: **

Запланированное событие CloudWatch для запуска лямбда-функции, которая опрашивает FAILED.

Обработка ошибок для данного источника события зависит от того, как вызывается Lambda. Amazon CloudWatch Events вызывает вашу функцию Lambda асинхронно.

...