Использование функций AWS Lambda для использования очередей AWS SQS

Я использую функцию AWS Lambda, которая запускается триггером события SNS для использования из очереди SQS. Когда функция Lambda выполняется, она извлекает 10 сообщений из очереди, обрабатывает их, извлекает еще 10 и т.д. ).

Насколько я понимаю, лямбда-функция, запускаемая событием SNS, является взаимно однозначной, это правильно? Другими словами, одно событие SNS не будет запускать несколько лямбда-функций (до максимального предела одновременного выполнения). Нет масштабирования в зависимости от нагрузки.

Есть ли другие потенциальные решения, использующие Lambda, которые позволили бы мне использовать SQS как можно чаще / быстрее? Я подумал о том, чтобы попытаться автоматически масштабировать свои функции Lambda, используя сигналы тревоги CloudWatch (и триггеры событий SNS) на основе размера очереди SQS, но похоже, что эти сигналы могут срабатывать не чаще, чем каждые 5 минут. Я также рассмотрел возможность разработки главной лямбда-функции, которая может автоматически выполнять (многие) подчиненные лямбда-выражения на основе запроса размера очереди.

Я понимаю, что более оптимальным вариантом может быть использование Kinesis вместо SNS. Я могу рассмотреть вопрос о включении Kinesis в будущем, но давайте просто сделаем вид, что Kinesis в настоящее время не вариант.


person littleK    schedule 28.01.2018    source источник
comment
Я не знаю никаких гарантий здесь, кроме того, что SNS будет повторять попытку в соответствии с настроенной политикой, а затем терпит неудачу. Но даже если бы Lambda вызывалась дважды (что, я подозреваю, было бы крайне редко), любые сообщения SQS, обрабатываемые Lambda # 1, были бы невидимы для Lambda # 2 (на время ожидания видимости).   -  person jarmod    schedule 28.01.2018
comment
Не уверен, что вы имеете в виду под . Другими словами, одно событие SNS не будет запускать несколько лямбда-функций (до максимального предела одновременного выполнения). Нет масштабирования на основе нагрузки. Функция Lambda будет вызываться для каждого сообщения, опубликованного в теме SNS ... даже если вызов функции из предыдущей публикации все еще выполняется, вплоть до предела параллелизма, который звучит как противоположное тому, что вы утверждаете, но я не уверен.   -  person Michael - sqlbot    schedule 29.01.2018
comment
@ Michael-sqlbot, я пытался утверждать, что количество выполнений Lambda равно количеству событий триггера SNS, но несколько экземпляров функций Lambda могут быть вызваны и выполнены одновременно (до максимального предела одновременного выполнения) .   -  person littleK    schedule 29.01.2018
comment
Верно. SNS будет вызывать функцию один раз для каждого сообщения о событии, опубликованного в теме.   -  person Michael - sqlbot    schedule 29.01.2018


Ответы (2)


Нет лучшего способа сделать это. Один из подходов (о котором вы уже упоминали) - использовать CloudWatch и запланировать выполнение функции Lambda каждую минуту (это минимальное время расписания для Lambda). Затем эта функция Lambda будет искать новые сообщения SQS и вызывать другие функции Lambda для обработки нового сообщения (сообщений). Вот очень хорошая статья для этого варианта использования: https://cloudonaut.io/integrate-sqs-and-lambda-serverless-architecture-for-asynchronous-workloads/

Лично я не рекомендую запускать вашу лямбду через SNS для этого варианта использования, потому что SNS не дает полной гарантии доставки и рекомендует отправлять уведомления SNS в SQS, что не решает вашу проблему. Из FAQ:

[...] Если критически важно, чтобы все опубликованные сообщения были успешно обработаны, разработчики должны иметь уведомления, доставляемые в очередь SQS (в дополнение к уведомлениям через другие транспорты).

Источник: https://aws.amazon.com/sns/faqs/

person s.hesse    schedule 31.01.2018

Для такого типа обработки вместо SQS, если вы отправляете сообщения в Kinesis Stream, вы должны иметь возможность гибко обрабатывать (пакетами необходимого размера) сообщения.

Примечание. Если вы используете SQS, после запуска лямбда-функции через SNS (или с помощью запланированной лямбда-функции) он может вызывать внутренние лямбда-функции для проверки очереди, в которой создаются несколько одновременных внутренних лямбда-выражений. Однако проблема в том, что нецелесообразно обрабатывать элементы SQS партиями.

person Ashan    schedule 31.01.2018