AWS SQS + SNS + Lambda

11

Zastanawiałem się, czy mogę wysłać wiadomość do kolejki SQS i zasubskrybować w niej temat SNS, aby uruchomić lambda do wysłania wiadomości e-mail.

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

Wiem, że komunikaty SNS mogą być wysyłane do SQS, ale jestem ciekawy, czy możliwe jest odwrócenie tego

Chida
źródło

Odpowiedzi:

11

Jedną rzeczą, którą zrobiłem, było stworzenie alarmu CloudWatch on ApproximateNumberOfMessagesVisible( >= 1 for 5 minutes) dla kolejki SQS. Alarm publikuje w temacie SNS, który uruchamia funkcję lambda. Funkcja lambda zapętla się, dopóki nie wyczyści kolejki.

Wywołanie alarmu może potrwać do 5 minut, ale działa fantastycznie w przypadku zadań zaplanowanych wsadowo bez potrzeby sprawdzania kolejki. (Granulacja alarmu wynosi 5 minut dla aktywnych kolejek).

kalmary
źródło
Myślę o zrobieniu dokładnie tego samego. Czy wiesz, czy opłata jest naliczana za każdym razem, gdy cloudwatch sprawdza kolejkę? Nie chodzi o to, że tak naprawdę rozmawiamy o duże pieniądze z tego rodzaju rzeczami, tylko bardziej ciekawi.
Brian F. Leighty
Ponadto zakładam, że z tego, co mówisz, alarm ciągle wysyła SNS alarmu w kółko? Na co masz ustawiony limit czasu w funkcji lambda?
Brian F Leighty
Jeszcze jedna rzecz. Przepraszamy za wszystkie komentarze. Byłem trochę zaniepokojony częścią „Przybliżone”. Czy zdarzyło Ci się kiedyś, że czekała tam wiadomość, która nie została rozwiązana, ponieważ myślała, że ​​jest tam tylko 0 pozycji zamiast 1 pozycji?
Brian F. Leighty
@BrianFLeighty czeki są bezpłatne. Ale nie alarmuje ciągle; może wymagać drugiego alarmu dla komunikatów siedzących w kolejce (dodano między zakończeniem wykonania lambda a następnym alarmem). Sondowanie może być lepszym rozwiązaniem; moja pracuje w typowo bardzo spokojnej kolejce (stąd nie warto
sondować
Pominięto komentarz „przybliżony”. To wydaje się działać dobrze, ale ymmv
squidpickles
7

SQS -> SNSTylko nie możesz iść SNS -> SQS.

Lambda obsługuje teraz planowanie, więc jedną z opcji jest zaimplementowanie odpylacza SQS w funkcji Lambda i częste jego uruchamianie.

Inną opcją do rozważenia jest to, czy rzeczywiście potrzebujesz kolejki. Lambda obsługuje przetwarzanie asynchroniczne (poprzez tryb wywoływania zdarzeń) i powinna przezroczyście skalować się w poziomie, aby obsługiwać równoległe wywołania. Jeśli twoja funkcja lambda nie wymaga dostępu do centralnego magazynu stanów, co może ograniczać równoległe wykonywanie, prawdopodobnie możesz po prostu uruchomić wszystkie swoje wywołania równolegle. Uważam jednak, że istnieje 100 równoczesnych limitów wykonania na konto, więc być może będziesz musiał pogrupować swoje wiadomości, aby pozostać na tym poziomie.

thexacre
źródło
3
nie ma też nic złego w korzystaniu z tradycyjnych sztuczek pollingu w kolejce za pomocą lambda: np. jeśli lambda usunie komunikat, podczas wykonywania, następnie ponownie uruchom funkcję na końcu; w przeciwnym razie pozwól, aby wykonał następny zgodnie z planem
nik.shornikov 26.04.16
1

SQSkolejka może być subskrybowana do SNStematu, aby przetwarzać otrzymane SNSwiadomości Obecnie nie można tego zrobić w innym kierunku bez dodatkowego kodowania (patrz np. LambdaFAQ ).

Powiedziałbym, że jest kilka opcji, jak to zrobić, ale nie jest tak elegancki, jak w przypadku bardziej powszechnego systemu sterowanego zdarzeniami AWS event->SQS->Lambda. W przeciwnym razie może być konieczne dostosowanie / wdrożenie kodu SQSprzetwarzania kolejek:

  1. możesz wdrożyć własne źródła zdarzeń
  2. możesz mieć pośrednią instancję EC2 do nasłuchiwania SQSkolejek, a następnie do wyzwalania Lambdazdarzeń SQS
dsmsk80
źródło
0

To pytanie zostało zadane i udzielono odpowiedzi jakiś czas temu, ale właśnie o tym pomyślałem, pomyślałem, że dodam podejście.

Jak wspomniano, źródła zdarzeń mogą być tutaj najlepszym wyborem. Alternatywnie i nie przetestowałem tego ani nie przemyślałem (więc jest to rodzaj akademicki), ale może być to możliwe poprzez wzorzec Fan-Out z SNS w następujący sposób:

 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

Przy użyciu tej konfiguracji przesłanie komunikatu do tematu SNS spowoduje umieszczenie go w kolejce SQS, jednocześnie wyzwalając towarzyszącą funkcję Lambda. Ta funkcja Lambda zostałaby napisana, aby odczytać tę samą kolejkę SQS, ale z włączonym długim odpytywaniem (do 20 sekund), aby nie czytała kolejki przed zakończeniem kolejki (tj. Warunkiem wyścigu).

Zasadniczo ten schemat just-in-time wywołuje jedną funkcję Lambda dla każdej kolejkowanej wiadomości SQS. Nie wiem, jak jednoczesne czytniki Long Poll działają na SQS (... czy ktoś się upuszcza?), Ale to tylko kolejny sposób na rozważenie rozwiązania tego problemu. = :)

NYCeyes
źródło