2015-01-23 25 views
7

Załóżmy, że mam 100 wątków czytających z tych samych kwantów - czy gwarantuje się, że każda wiadomość zostanie dostarczona najwyżej raz? Czy w ogóle możliwe jest dostarczenie tej samej wiadomości więcej niż raz? Nie mogę znaleźć żadnej jasnej dokumentacji na ten temat. sSQS dostarczanie wiadomości tylko raz

Odpowiedz

13

Aktualizacja 17 listopada 2016:FIFO queueing with guaranteed-once delivery został właśnie wydany dzisiaj (prawie 2 lata po tym odpowiedź została pierwotnie wysłane) i SQS obsługuje dostawy dokładnie jednorazowe. Oto szczegóły:

  • Musisz utworzyć FIFO Queue.
  • Kontrola deduplikacji dla MessageDeduplicationId jako atrybutu komunikatu kolejki i zapobiega duplikowaniu wiadomości przed wysłaniem i otrzymaniem w 5-minutowym odstępie czasu deduplikacji po wykonaniu każdej z tych czynności, sprawdzając numer MessageDeduplicationId.
  • Jeśli deduplikacja oparta na treści jest jawnie włączona w kolejce FIFO, MessageDeduplicationId zostanie automatycznie wygenerowany przy użyciu skrótu SHA-256 treści wiadomości (tylko treść, a nie atrybuty).
  • Jeśli deduplikacja oparta na treści nie jest włączona, musisz jawnie ustawić własną dowolną wartość dla MessageDeduplicationId przy wysyłaniu. W przeciwnym razie SendMessage zakończy się niepowodzeniem z błędem.

Oparte na zawartości deduplikację można włączyć, gdy creating a queue lub updating the queue' attributes.

Więcej informacji na temat dokumentu MessageDeduplicationId w dokumentacji SendMessage i ReceiveMessage.


Po 17 listopada 2016 roku, to nadal ma zastosowanie do standardowych (nie-FIFO) kolejkach:

Ze względu na charakter rozproszony standardowych (nie-FIFO) kolejek w SQS, gwarancja jest zamiast tego "co najmniej" raz.

Z FAQ:

Q: Ile razy będę odbierać każdą wiadomość?

Amazon SQS został zaprojektowany tak, aby dostarczać "co najmniej raz" wszystkie wiadomości w kolejkach. Mimo że w większości przypadków każda wiadomość będzie dostarczana do aplikacji dokładnie jeden raz, należy zaprojektować swój system , aby przetwarzanie wiadomości więcej niż jeden raz nie powodowało błędów ani niespójności w postaci .

Więcej informacji na at least once dostawy:

Amazon SQS przechowuje kopie wiadomości na wielu serwerach dla redundancji i wysokiej dostępności. W rzadkich przypadkach jeden z serwerów przechowujących kopię wiadomości może być niedostępny po otrzymaniu lub usunięciu wiadomości. Jeśli tak się stanie, kopia wiadomości nie zostanie usunięta na tym niedostępnym serwerze, a możesz otrzymać kopię wiadomości ponownie, gdy odbierzesz wiadomości. Z tego powodu musisz zaprojektować swoją aplikację jako idempotentną (tzn. Nie można jej negatywnie wpłynąć, jeśli przetwarza ten sam komunikat więcej niż jeden raz).

Jeśli naprawdę potrzebujesz, aby zagwarantować „co najwyżej jeden raz” przetwarzania w aplikacji, można aplikacja sprawdzić unique identifiers of SQS messages i nie procesowe wiadomość identyfikatory, które zostały zrealizowane wcześniej, lub są aktualnie przetwarza.

+0

Największe pytanie dotyczy tego, czy może to nastąpić w bardzo krótkim czasie. Czy wątek 1 i wątek 2 mogą otrzymać tę samą wiadomość w ciągu sekundy od każdego żądania. Tego nie mogłem znaleźć w dokumentacji. Przyjąłem odpowiedź tak czy owak, ponieważ zbliża się ona do tego, czego szukałem. – Vladimir

+0

Oczywiście, jest jeszcze jedno pytanie, które dokładnie zadał pytanie: http://stackoverflow.com/questions/28130677/time-period-between-duplicate-messages –

+0

Skąd mam wiedzieć, czy praca jest obecnie przetwarzana? –