Обработка сообщений AWS Lambda в пакетном режиме - PullRequest
0 голосов
/ 08 февраля 2019

Мне интересно кое-что, и я действительно не могу найти информацию об этом.Может быть, это не тот путь, но я просто хотел бы знать.

Речь идет о работе Lambda в пакетном режиме.Я знаю, что могу настроить Lambda для приема пакетных сообщений.В моей лямбда-функции я перебираю каждое сообщение, и если оно выходит из строя, лямбда выходитИ цикл начинается снова.

Мне интересно немного другой подход. Предположим, у меня есть три сообщения: A , B и C .Я также беру их в партиях.Теперь, если происходит сбой сообщения B (например, сбой вызова API), я возвращаю сообщение B в SQS и продолжаю обрабатывать сообщение C.

Возможно ли это?Если это так, это хороший подход?Потому что я вижу, что мне нужно реализовать некоторые дополнительные сложности в Lambda, а что нет.

Спасибо

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

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

Возможный подход для достижения этой цели - перебирать список ваших событий (Например, [eventA, eventB, eventC]), и для каждого выполнения добавляйте список неудачных событий, если событие не удалось.Затем создайте конечный случай, который проверяет, есть ли в списке неудачных событий что-либо, и, если это так, вручную отправляет сообщения обратно в SQS (используя SQS sendMessageBatch ).

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

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

0 голосов
/ 10 февраля 2019

Здесь есть отличная статья .Для вас важными частями являются ...

  • Использование batchSize 1, чтобы сообщения успешно выполнялись или не выполнялись самостоятельно.
  • Убедитесь, что ваша обработка идемпотентна, поэтому повторная обработкасообщение не является вредным, за исключением дополнительных затрат на обработку.
  • Обрабатывайте ошибки в коде своей функции, возможно, перехватывая их и отправляя сообщение в очередь недоставленных сообщений для дальнейшей обработки.
  • Вызов API DeleteMessage вручную в вашей функции после успешной обработки сообщения.

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

sqs = boto3.client('sqs')

def handler(event, context):
    failed = False

    for msg in event['Records']:
        try:
            # Do something with the message.
            handle_message(msg)
        except Exception:
            # Ok it failed, but allow the loop to finish.
            logger.exception('Failed to handle message')
            failed = True
        else:
            # The message was handled successfully. We can delete it now.
            sqs.delete_message(
                QueueUrl=<queue_url>,
                ReceiptHandle=msg['receiptHandle'],
            )

    # It doesn't matter what the error is. You just want to raise here
    # to ensure the trigger doesn't delete any of the failed messages.
    if failed:
        raise RuntimeError('Failed to process one or more messages')

def handle_msg(msg):
    ...
0 голосов
/ 08 февраля 2019

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

Предлагаю прочитать о Поведение лямбда-повтора и Очереди мертвых букв.

...