Published on

AWS SNS vs SQS - kiedy używać którego?

Authors
  • avatar
    Name
    Piotr Kołodziejczyk
    Twitter
AWS SNS vs SQS - kiedy używać którego?

Obie usługi służą do przesyłania wiadomości, obie żyją w ekosystemie AWS - ale rozwiązują inne problemy. Pomylenie ich kosztuje czas przy debugowaniu architektur, które nie zachowują się tak jak powinny.

SQS - kolejka

Simple Queue Service to kolejka komunikatów typu point-to-point. Producent wrzuca wiadomość, konsument ją pobiera i przetwarza. Wiadomość znika po przetworzeniu.

Producent[Kolejka SQS]Konsument

Kluczowe właściwości:

  • Pull model - konsument sam odpytuje kolejkę (ReceiveMessage)
  • Jeden konsument na wiadomość - każda wiadomość trafia do dokładnie jednego workera
  • Retention - wiadomości czekają do 14 dni, jeśli nikt nie pobierze
  • Dead Letter Queue - nieprzetworzone wiadomości trafiają do DLQ po N próbach
  • FIFO i Standard - Standard gwarantuje dostarczenie (at-least-once), FIFO gwarantuje kolejność i exactly-once

Kiedy używasz SQS: masz zadania do przetworzenia (resize zdjęcia, wysyłka maila, import CSV) i chcesz je rozłożyć między wiele workerów bez utraty żadnego.

SNS - pub/sub

Simple Notification Service to system publish/subscribe. Producent publikuje wiadomość do topicu, SNS rozsyła ją do wszystkich subskrybentów jednocześnie.

         ┌→ Lambda A
Producent[Topic SNS] ─→ SQS Queue
         └→ Email/HTTP

Kluczowe właściwości:

  • Push model - SNS sam dostarcza do subskrybentów
  • Fan-out - jedna wiadomość trafia do N odbiorców naraz
  • Brak persystencji - jeśli subskrybent jest niedostępny w momencie wysyłki, wiadomość przepada (chyba że subskrybentem jest SQS)
  • Filtry - można filtrować wiadomości per subskrybent na podstawie atrybutów

Kiedy używasz SNS: zdarzenie powinno wyzwolić wiele niezależnych akcji jednocześnie - np. zamówienie trafia do SNS, a subskrybentami są: kolejka do wysyłki maila, kolejka do magazynu, system analityki.

Porównanie

CechaSQSSNS
ModelPull (polling)Push (fan-out)
Odbiorcy1 konsument / wiadomośćN subskrybentów
PersystencjaDo 14 dniBrak (fire & forget)
Gwarancja dostarczeniaAt-least-once / exactly-onceBest-effort (do subskrybentów)
Retry / DLQWbudowanyTylko przez SQS jako subscriber
KolejnośćFIFO (opcjonalnie)Brak

SNS + SQS razem - fan-out pattern

Najczęstszy wzorzec produkcyjny: SNS do rozgłaszania, SQS do niezawodnego przetwarzania.

[Topic SNS]
  ├→ [SQS Queue 1]Lambda (wysyłka maila)
  ├→ [SQS Queue 2]Lambda (aktualizacja magazynu)
  └→ [SQS Queue 3]Lambda (analityka)

Dlaczego nie bezpośrednio SNS → Lambda? Bo Lambda może być niedostępna, throttlowana, albo po prostu padnie. SQS buforuje wiadomości i zapewnia retry. SNS → Lambda to dobry wybór tylko dla szybkich, niekrytycznych operacji.

Przykład w Terraform:

resource "aws_sns_topic" "orders" {
  name = "orders"
}

resource "aws_sqs_queue" "email_queue" {
  name = "orders-email"
}

resource "aws_sns_topic_subscription" "email" {
  topic_arn = aws_sns_topic.orders.arn
  protocol  = "sqs"
  endpoint  = aws_sqs_queue.email_queue.arn
}

Jak wybrać?

  • Masz zadania do przetworzenia przez workery? → SQS
  • Jedno zdarzenie powinno dotrzeć do wielu konsumentów? → SNS

Linki