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

- Name
- Piotr Kołodziejczyk

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
| Cecha | SQS | SNS |
|---|---|---|
| Model | Pull (polling) | Push (fan-out) |
| Odbiorcy | 1 konsument / wiadomość | N subskrybentów |
| Persystencja | Do 14 dni | Brak (fire & forget) |
| Gwarancja dostarczenia | At-least-once / exactly-once | Best-effort (do subskrybentów) |
| Retry / DLQ | Wbudowany | Tylko 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