2015-02-12 5 views
7

Ich habe einen S3-Bucket eingerichtet, um ein Ereignis auf dem PUT-Objekt an SQS zu senden, und ich handhabe die SQS-Warteschlange in einer EB-Arbeitsebene.Sendet SQS tatsächlich mehrere S3 PUT Objektdatensätze pro Nachricht?

Das Schema für die Nachricht, die SQS ist hier sendet: http://docs.aws.amazon.com/AmazonS3/latest/dev/notification-content-structure.html

Records ist ein Array, was bedeutet, dass es in einem Post in meinem Arbeiter Endpunkt gesendet mehrere Datensätze sein. Passiert das tatsächlich? Oder erhält mein Mitarbeiter nur einen Datensatz pro Nachricht?

Der Sachbearbeiter kann nur eine Antwort zurückgeben, entweder 200 (Nachricht erfolgreich verarbeitet) oder nicht 200 (Nachricht wurde nicht erfolgreich verarbeitet, wodurch sie in die Warteschlange versetzt wird), unabhängig davon, wie viele Datensätze in der Nachricht empfangen werden.

Also, wenn mein Worker mehrere Datensätze in einer Nachricht empfängt und einige erfolgreich verarbeitet (sagen Sie etwas mit Nebenwirkungen wie das Einfügen in eine Datenbank), aber einen oder mehrere fehlschlägt, wie soll ich das behandeln? Wenn ich 200 zurückgebe, werden die fehlgeschlagenen nicht wiederholt. Aber wenn ich nicht-200 zurückgebe, werden diejenigen, die erfolgreich behandelt wurden, unnötigerweise erneut versucht und möglicherweise wieder eingefügt. Also müsste ich meinen Arbeiter schlau genug machen, nur die fehlgeschlagenen zu wiederholen - was Logik ist, würde ich lieber nicht schreiben wollen.

Dies wäre viel einfacher, wenn nur ein Datensatz je Nachricht gesendet wurde. Wenn das in der Praxis der Fall ist, würde ich das gerne wissen, auch wenn es sich bei den Aufzeichnungen um ein Array handelt.

Antwort

7

Um klar zu sein, es ist nicht die Datensätze, die "SQS sendet." Es sind die Datensätze, die S3 an SQS sendet (oder an SNS oder Lambda).

Momentan haben alle S3-Ereignisbenachrichtigungen ein einzelnes Ereignis pro Benachrichtigungsnachricht. Wir könnten mehrere Datensätze einschließen, wenn wir in der Zukunft neue Ereignistypen hinzufügen. Dies ist auch ein Nachrichtenformat, das für andere AWS-Dienste freigegeben ist. Andere Dienste können mehrere Datensätze enthalten.

https://forums.aws.amazon.com/thread.jspa?messageID=592264&#592264

Also, für den Moment scheint es, gibt es nur einen Datensatz pro Nachricht.

Aber ... Sie machen einen Fehler, wenn Sie annehmen, dass Ihre Anwendung nicht bereit sein muss, wiederholte oder doppelte Nachrichten zu verarbeiten. In jedem massiven und verteilten System wie SQS ist es extrem schwierig, absolut zu garantieren, dass dies nie passieren kann, jedoch unwahrscheinlich:

F: Wie oft werde ich jede Nachricht erhalten?

Amazon SQS wurde entwickelt, um "mindestens einmal" die Zustellung aller Nachrichten in seinen Warteschlangen zu ermöglichen. Obwohl die meisten Nachrichten in der Regel genau einmal an Ihre Anwendung gesendet werden, sollten Sie Ihr System so entwerfen, dass die mehrmalige Verarbeitung einer Nachricht keine Fehler oder Inkonsistenzen verursacht.

http://aws.amazon.com/sqs/faqs/

übrigens in meiner Plattform, mehr als ein Eintrag in den Datensatz Array wird als Fehler angesehen, wodurch die Nachricht an die dead letter queue zur Überprüfung verlassen und zu senden.

+1

Danke, das war hilfreich. Ich mag Ihren Ansatz, den Multiple-Records-Fall vorerst nicht zu behandeln, und schätze es, wenn Sie "mindestens einmal" ausrufen. – sandinmyjoints

+0

_ "In jedem massiven und verteilten System wie SQS ist es extrem schwierig, absolut zu garantieren, dass dies niemals passieren kann" _ - Nur um zu verdeutlichen - es ist nicht nur "extrem schwierig", sondern aufgrund der verteilten Natur des Dienstes unmöglich. Siehe [this] (http://stackoverflow.com/a/38290017/836214) für einige Informationen zur Duplizierung. – Krease

+2

@Krease mein Kommentar war eigentlich in Bezug auf die Einschränkungen auf das Design des Dienstes selbst - - nicht die Verbraucher des Dienstes. Es ist extrem schwierig, ein System * wie * SQS zu entwerfen, um keine Doppelungen zu garantieren, aber es ist nicht unmöglich ... eine solche Konsistenzgarantie würde jedoch einen Kompromiss in Bezug auf Verfügbarkeit und/oder Partitionstoleranz bedeuten und hätte wahrscheinlich ein Leistungseinbuße aufgrund erhöhter Kommunikation/Koordination zwischen den Servicekomponenten. Es kann jedoch nicht garantiert werden, dass für einen SQS-Verbraucher niemals eine doppelte Lieferung erfolgt. –

Verwandte Themen