Что происходит с AWS SQS-сообщениями? - PullRequest
1 голос
/ 17 июня 2020

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

Lambda 1 (logi c): записывает от 1 до 50 в очередь SQS как 50 различных сообщений.

Lambda 2 (триггер лямбда для очереди SQS): (размер пакета 10, concurreny undefied ) Печатает номер, полученный из очереди. (Можно увидеть это в журналах облачных часов)

 def lambda_handler(event, context):
    # TODO implement
    print (event)
    print("*")
    print(json.loads(event['Records'][0]['body'])['search_query'])
    time.sleep(5)
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    } 

Сценарий 1: Когда я пишу всего 5-10 сообщений в очередь, все сообщения принимаются и обрабатываются в лямбда-выражении (проверено в журналах cloudwatch).

Сценарий 2: Когда я записываю 50 сообщений в очередь: при мониторинге очереди показывает, что все сообщения получены. (нет сообщений в доступном состоянии или в статусе в полете). Принимая во внимание, что когда я go и проверяю журналы cloudwatch, вызывается только 14 экземпляров лямбда, которые обрабатывают 14 сообщений и распечатывают детали в журналах cloudwatch.

ПРИМЕЧАНИЕ: Для двойной проверки у меня есть внес изменения в Lambda 2, чтобы записать сообщение в DynamoDB, который также содержит только 14 деталей сообщения.

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

Редактировать 1: Когда параллелизм установлен на 1, все 50 сообщений обрабатываются лямбда-функцией.

Редактировать 2: Спасибо за предложения, мы обнаружили, что проблема в том, как мы читали сообщения. json .loads (event ['Records'] [0] ['body'])

Наше предположение было независимо от размера пакета, SQS отправит только одно сообщение лямбда.

После выполнив пару тестов, мы выяснили, когда лямбда-функция просто печатает сообщение (что означает отсутствие задержки в выполнении), мы видим, что SQS передает только одно сообщение за раз, даже если размер пакета установлен на 10. Однако, когда есть задержка (time.sleep (5)), затем мы видим, что SQS передает одно сообщение, 2 сообщения, 7 сообщений для некоторых лямбда-вызовов. Как именно работает размер пакета SQS при интеграции с Lambda. (Добавлен код Lambda2 для справки)

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Согласно документации , если вы установите размер пакета 10, но ваша очередь SQS имеет менее 1000 сообщений, вы с меньшей вероятностью получите полный пакет из 10 сообщений в ваших вызовах. Для получения дополнительной информации см. ReceiveMessage в Справочнике по API Amazon SQS.

0 голосов
/ 18 июня 2020

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

Можете поделиться своим кодом? Вы просматриваете весь список сообщений в элементе Records вашего объекта ?

Это странно, потому что вы утверждаете, что когда для параметра concurrency установлено значение 1, он работает, но настройка лямбда-параллелизм меньше 5 для SQS определенно не рекомендуется :(. Вы имеете в виду параллелизм или размер пакета?

...