AWS SQS + SNS + Lambda

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

SQS -> SNS -> (Lambda) -> SES

Я знаю, что сообщения SNS можно отправлять в SQS, но я ' Мне любопытно, возможно ли обратное

11
задан 30 September 2016 в 00:54
4 ответа
Очередь SQS может быть подписана на тему SNS и таким образом обрабатывать полученные сообщения SNS. В настоящее время это невозможно сделать в другом направлении без дополнительного кодирования (см., например, Lambda FAQ).

Я бы сказал, что есть несколько вариантов, как это сделать, но это не так элегантно, как использование более распространенной событийно-ориентированной системы AWS event->SQS->Lambda. В противном случае может потребоваться настройка/внедрение кода, как обрабатываются очереди SQS:

  1. вы можете реализовать свои собственные источники событий
  2. у вас может быть какой-нибудь промежуточный экземпляр EC2 для прослушивания очередей SQS, а затем для срабатывания Lambda на событиях SQS
1
ответ дан 2 December 2019 в 21:47

Одна вещь, которую я сделал, - это создание тревоги CloudWatch на ApproximateNumberOfMessagesVisible (> = 1 в течение 5 минут ) для очереди SQS. Аварийный сигнал публикуется в теме SNS, которая запускает лямбда-функцию. Лямбда-функция зацикливается, пока не очистит очередь.

Для срабатывания сигнала тревоги может потребоваться до 5 минут, но она отлично работает для задач, запланированных на пакет, без необходимости опрашивать очередь. (Детализация сигналов тревоги составляет 5 минут для активных очередей.)

11
ответ дан 2 December 2019 в 21:47

Вы не можете перейти SQS -> SNS, только SNS -> SQS.

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

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

7
ответ дан 2 December 2019 в 21:47

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

Как уже упоминалось, Источники событий могут быть здесь лучшим выбором. В качестве альтернативы, и я не тестировал это и не думал об этом (так что это своего рода академический), но это может быть возможно выполнить с помощью шаблона Fan-Out с SNS следующим образом:

 1. Create a SNS topic.............................: SNS-topic-01
 2. Subscribe a SQS queue to that topic............: SQS-queue-01
 3. Subscribe a Lambda Function to that topic......: LAMBDA-func-01

Используя эту конфигурацию, отправьте сообщение в тему SNS помещает его в очередь SQS, одновременно вызывая сопутствующую лямбда-функцию. Эта лямбда-функция будет написана для чтения той же самой очереди SQS, но с включенным длинным опросом (до 20 секунд), чтобы она не считывала очередь до завершения постановки в очередь (то есть состояния гонки).

По сути, эта схема точно в срок вызывает одну лямбда-функцию для каждого помещенного в очередь сообщения SQS. Я не знаю, как одновременные читатели Long Poll работают с SQS (... один из них упал?), Но это просто еще один способ решить эту проблему. =:)

0
ответ дан 2 December 2019 в 21:47

Теги

Похожие вопросы