AWS SQS + SNS + Lambda

11

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

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

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

Chida
источник

Ответы:

11

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

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

squidpickles
источник
Я думаю сделать то же самое. Знаете ли вы, если вы платите каждый раз, когда cloudwatch проверяет вашу очередь? Не то чтобы мы действительно говорили большие деньги с такими вещами, просто более любопытными.
Брайан Ф Лейти
Кроме того, я предполагаю, что из того, что вы говорите, сигнал тревоги продолжает посылать SNS сигнала снова и снова? Какое у вас время ожидания для вашей лямбда-функции?
Брайан Ф. Лейти
Еще одна вещь. Извините за все комментарии. Я был немного обеспокоен частью «Приблизительно». Было ли у вас когда-нибудь время, когда там ждали сообщения, которые не были рассмотрены, так как считалось, что вместо 1 элемента было только 0 элементов?
Брайан Ф Лейти
@BrianFLeighty чеки бесплатны. Но это не тревожит постоянно; это может потребовать второй сигнал тревоги для сообщений, находящихся в очереди (добавляется между завершением лямбда-выполнения и следующим сигналом тревоги). Опрос может быть лучшим решением; мой работает в типично очень тихой очереди (следовательно, не стоит опрашивать.)
squidpickles
Пропустил "приблизительный" комментарий. Это, кажется, работает нормально, но ymmv
squidpickles
7

Ты не можешь идти SQS -> SNS, только SNS -> SQS.

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

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

thexacre
источник
3
также нет ничего плохого в использовании традиционных приемов-обработчиков очереди с лямбдой: например, если лямбда исключает сообщение во время выполнения, затем повторно запускает функцию в конце; в противном случае пусть он будет выполнен следующим, как было запланировано
nik.shornikov
1

SQSОчередь можно подписать на SNSтему и так обрабатывать полученные SNSсообщения. В настоящее время это невозможно в другом направлении без дополнительного кодирования (см., Например, LambdaFAQ ).

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

  1. Вы можете реализовать свои собственные источники событий
  2. Вы можете иметь некоторый промежуточный экземпляр EC2 для прослушивания SQSочередей и последующего запуска Lambdaсобытий SQS
dsmsk80
источник
0

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

Как уже упоминалось, источники событий могут быть лучшим выбором здесь. В качестве альтернативы, и я не проверял это и не продумывал это (так что это своего рода академический подход), но это может быть возможно сделать через шаблон разветвления с 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 (... один отбрасывается?), Но это просто еще один способ решить эту проблему. знак равно

NYCeyes
источник