Мне было интересно, могу ли я отправить сообщение в очередь SQS и подписаться на тему SNS, чтобы вызвать лямбда для отправки электронной почты.
SQS -> SNS -> (Lambda) -> SES
Я знаю, что сообщения SNS можно отправлять в SQS, но я ' Мне любопытно, возможно ли обратное
SNS
и таким образом обрабатывать полученные сообщения SNS
. В настоящее время это невозможно сделать в другом направлении без дополнительного кодирования (см., например, Lambda
FAQ).
Я бы сказал, что есть несколько вариантов, как это сделать, но это не так элегантно, как использование более распространенной событийно-ориентированной системы AWS event->SQS->Lambda
. В противном случае может потребоваться настройка/внедрение кода, как обрабатываются очереди SQS
:
SQS
, а затем для срабатывания Lambda
на событиях SQS Одна вещь, которую я сделал, - это создание тревоги CloudWatch на ApproximateNumberOfMessagesVisible
(> = 1 в течение 5 минут
) для очереди SQS. Аварийный сигнал публикуется в теме SNS, которая запускает лямбда-функцию. Лямбда-функция зацикливается, пока не очистит очередь.
Для срабатывания сигнала тревоги может потребоваться до 5 минут, но она отлично работает для задач, запланированных на пакет, без необходимости опрашивать очередь. (Детализация сигналов тревоги составляет 5 минут для активных очередей.)
Вы не можете перейти SQS -> SNS
, только SNS -> SQS
.
Lambda теперь поддерживает планирование, поэтому одним из вариантов является реализация SQS-опроса в функции Lambda и его частый запуск.
Другой вариант, который необходимо рассмотреть, действительно ли вам нужна очередь. Lambda поддерживает асинхронную обработку (через режим вызова событий) и должна прозрачно масштабироваться по горизонтали для обработки параллельных вызовов. Если ваша лямбда-функция не требует доступа к центральному хранилищу состояний, что может ограничить параллельное выполнение, то вы, вероятно, можете просто выполнять все ваши вызовы параллельно. Однако я считаю, что существует 100 параллельных лимитов выполнения на одну учетную запись, так что вам может понадобиться пакетная отправка сообщений, чтобы остаться под этим.
Это был задан и ответил некоторое время назад, но только сам подумал об этом, подумал, что добавлю подход.
Как уже упоминалось, Источники событий могут быть здесь лучшим выбором. В качестве альтернативы, и я не тестировал это и не думал об этом (так что это своего рода академический), но это может быть возможно выполнить с помощью шаблона 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 (... один из них упал?), Но это просто еще один способ решить эту проблему. =:)