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