2012-11-21 15 views
18

Nach dem documentation:Was ist eine gute Vorgehensweise, um das Verhalten "Exakt einmal liefern" mit Amazon SQS zu erreichen?

Q: Wie oft werde ich jede Nachricht erhalten?

Amazon SQS ist engineered „mindestens einmal“ delivery in seiner Warteschlangen aller Nachrichten bereitzustellen. Obwohl die meiste Zeit jede Nachricht an Ihre Anwendung genau einmal geliefert wird, sollten Sie Ihr System so entwerfen, dass eine Nachricht mehr als einmal verarbeitet keine Fehler oder Inkonsistenzen erstellt.

Gibt es eine gute Praxis, um die Lieferung genau einmal zu erreichen?

Ich dachte über die Verwendung der DynamoDB “Conditional Writes” als verteilter Schließmechanismus, aber ... eine bessere Idee?


Einige Verweis auf dieses Thema:

+6

BTW am Ende habe ich "DynamoDB Conditional Writes" –

Antwort

3

FIFO-Warteschlangen sind jetzt verfügbar und bieten, genau einmal out of the box bestellt.

https://aws.amazon.com/sqs/faqs/#fifo-queues

Ihrer Region Verfügbarkeit prüfen.

+0

FIFO-Warteschlangen sind nicht mit SNS kompatibel. Wenn Sie also eine Kombination aus SNS + SQS verwenden, können Sie sie nicht verwenden. https: //docs.aws.amazon.com/AWSSimpleQueueService/neueste/SQSDeveloperGuide/sqs-subscribe-queue-sns-topic.html –

7

Die beste Lösung ist wirklich genau hängt davon ab, wie wichtig es ist, dass Sie die Aktion in der nicht durchführen vorgeschlagen Nachricht mehr als einmal. Für einige Aktionen wie das Löschen einer Datei oder das Ändern der Größe eines Bildes ist es nicht wichtig, ob es zweimal passiert, also ist es in Ordnung, nichts zu tun. Wenn es wichtiger ist, die Arbeit ein zweites Mal nicht zu machen, verwende ich eine Kennung für jede Nachricht (vom Absender erzeugt) und der Empfänger verfolgt die Duplikate, indem er die IDs markiert, wie sie in mechachd zu sehen sind. Gut für viele Dinge, aber wahrscheinlich nicht, wenn Leben oder Geld davon abhängt, vor allem wenn es mehrere Konsumenten gibt.

Bedingte Schreibvorgänge klingen wie eine clevere Lösung, aber ich frage mich, ob AWS nicht so eine großartige Lösung für Ihr Problem ist, wenn Sie eine kugelsichere Lösung benötigen.

+6

+1 Ich stimme zu, Amazon Kompromisse für sqs downgrades es als Messaging-Lösung für viele Arten von Anwendungen. Ich wünschte, sie würden ihre eigene Synchronisierungslösung als ein optionales Verhalten anbieten, das Sie zu einem verständlichen Leistungsaufwand aktivieren könnten, anstatt dass wir alle die gleichen Problemumgehungen bewältigen müssen. –

1

Eine weitere Alternative für das verteilte Sperren ist der Redis-Cluster, der auch mit AWS ElasticCache bereitgestellt werden kann. Redis unterstützt transactions, die garantieren, dass gleichzeitige Aufrufe nacheinander ausgeführt werden.

Einer der Vorteile von Cache besteht darin, dass Sie Ablauftimeouts festlegen können. Wenn Ihre Nachrichtenverarbeitung fehlschlägt, wird die Sperre daher zeitgesteuert freigegeben.