2012-08-10 3 views
7

Ich verwende Boto-Bibliothek in Python, um Amazon SQS-Nachrichten zu erhalten. In Ausnahmefällen lösche ich keine Nachrichten aus der Warteschlange, um einige weitere Änderungen zur Wiederherstellung temporärer Fehler vorzunehmen. Aber ich möchte nicht fortlaufend Fehlermeldungen erhalten. Was ich tun möchte, ist entweder Nachrichten nach dem Empfang mehr als 3 mal zu löschen oder keine Nachricht zu erhalten, wenn die Anzahl der Empfänger mehr als 3 ist.Wie erhalten Nachrichten empfangen in Amazon SQS mit Boto-Bibliothek in Python zählen?

Was ist die eleganteste Art, es zu tun?

Antwort

3

Es gibt mindestens ein paar Möglichkeiten, dies zu tun.

Wenn Sie eine Nachricht in Boto lesen, erhalten Sie ein Nachrichtenobjekt oder eine Unterklasse davon. Das Nachrichtenobjekt hat ein Feld "Attribute", das ein Dict ist, das alle von SQS bekannten Nachrichtenattribute enthält. Eines der Dinge, die SQS verfolgt, ist die ungefähre Anzahl der Male, die die Nachricht gelesen wurde. Sie können diesen Wert also verwenden, um zu bestimmen, ob die Nachricht gelöscht werden soll oder nicht, aber Sie müssen mit der "ungefähren" Art des Werts vertraut sein.

Alternativ können Sie Nachrichten-IDs in einer Datenbank speichern und jedes Mal, wenn Sie die Nachricht lesen, ein Zählfeld in der Datenbank inkrementieren. Dies könnte in einem einfachen Python-Diktat erfolgen, wenn die Nachrichten immer in einem einzigen Prozess gelesen werden oder in etwas wie SimpleDB, wenn Sie Messwerte über Prozesse hinweg erfassen müssen.

Hoffe, dass hilft.

Hier einige Beispiel-Code:

>>> import boto.sqs 
>>> c = boto.sqs.connect_to_region() 
>>> q = c.lookup('myqueue') 
>>> messages = c.receive_message(q, num_messages=1, attributes='All') 
>>> messages[0].attributes 
{u'ApproximateFirstReceiveTimestamp': u'1365474374620', 
u'ApproximateReceiveCount': u'2', 
u'SenderId': u'419278470775', 
u'SentTimestamp': u'1365474360357'} 
>>> 
+0

danke für Ihre Antwort. Ich habe die Boto-Dokumentation überflogen, konnte aber keine Anhaltspunkte dafür finden, wie viele Nachrichten empfangen wurden. Weißt du, wo es ist? Übrigens ist es eine alternative Möglichkeit, dieses Problem zu lösen, indem ich eine einfache lokale Datenbank verwalte. Aber zuerst möchte ich es einfach halten - wie wenn ich empfangen würde. – huzeyfe

+0

Können Sie ein Syntaxbeispiel hinzufügen? Alles, was ich finde, ist ein leeres Wörterbuch, wenn ich eine Nachricht mehr als einmal lese und auf message_instance.atattributes schaue. – tponthieux

1

Es sollte in wenigen Schritten durchgeführt werden.

  1. erstellen SQS-Verbindung: - sqsconnrec = SQSConnection (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
  2. erstellen Warteschlangenobjekt: - request_q = sqsconnrec.create_queue ("queue_name")
  3. Last der Warteschlangennachrichten: - Nachrichten = request_q.get_messages()
  4. jetzt erhalten Sie die Reihe von Nachrichtenobjekten und die Gesamtzahl der Nachrichten zu finden: - nur tun len (Nachrichten)

sollte wie Charme funktionieren.

+0

Vielen Dank für Ihre Aufmerksamkeit, aber ich fürchte, das war nicht mein Fall. Ich brauche keine len (messages) Ich brauche die Empfangszahl einer bestimmten Nachricht. – huzeyfe

+1

Ja, es gibt keine definierte Funktion in Boto, um den Empfangszählwert zu erhalten. Ich würde vorschlagen, dass Sie ein lokales Tupel behalten, das Nachrichtenidentifikation, Zahl der Zählung und Nachrichtkörper hat. Sie laden die Nachrichten aus der Warteschlange nach einer bestimmten Zeit, überprüfen Sie, ob die ID im Tupel vorhanden ist, wenn ja, erhöhen Sie die Anzahl der empfangenen Nachrichten, wenn die Anzahl der empfangenen Nachrichten> 3 ist, können Sie die Nachricht entfernen. Ich sah das Verzeichnis des Nachrichtenobjekts und es hat keine Empfangszählfunktion. Hoffe es hilft deinem Problem. –

+0

Dies war die alternative Lösung für die ich jetzt denke ich habe nur diese Option. Vielen Dank .. – huzeyfe

4

Andernfalls könnten Sie eine zusätzliche Kennung am Ende der Nachricht in Ihrer SQS-Warteschlange einfügen. Dieser Bezeichner kann die Anzahl der Male beibehalten, die die Nachricht gelesen wurde.

Auch wenn Sie möchten, dass Ihr Dienst diese Nachrichten nicht immer wieder abfragen sollte, können Sie eine weitere Warteschlange erstellen, sagen "Dead Message Queue" und können dann die Nachricht übertragen, die den Schwellenwert überschritten hat.

1

Das ApproximateReceiveCount-Attribut aus der Nachricht erhalten, die Sie gelesen haben. verschieben Sie es in eine andere Warteschlange (als Sie Fehlermeldungen verwalten können) oder löschen Sie es einfach.

foreach (var message in response.Messages){ 
     try{ 
      var notifyMessage = JsonConvert.DeserializeObject<NotificationMessage>(message.Body); 
        Global.Sqs.DeleteMessageFromQ(message.ReceiptHandle); 
      } 
     catch (Exception ex){ 
      var receiveMessageCount = int.Parse(message.Attributes["ApproximateReceiveCount"]); 
      if (receiveMessageCount >3) 
       Global.Sqs.DeleteMessageFromQ(message.ReceiptHandle); 
      } 
     } 
2

aws hat eingebaute Unterstützung für diese, nur die folgenden Schritte folgen:

  1. erstellen Dead Letter Queue
  2. weiterzutreiben Politik für die Quellen-Warteschlange aktivieren, indem Sie "Use weiterzutreiben Policy" Überprüfung
  3. wählen Sie die Warteschlange für unzustellbare Sie in Schritt # 1 für "dead letter Queue" erstellt
  4. Set "Maximum erhält" als "3" oder einen beliebigen Wert zwischen 1 und 1000

Wie es funktioniert, ist, wann immer eine Nachricht vom Arbeiter empfangen wird, die Empfangszählung inkrementiert. Sobald die Anzahl der eingehenden Nachrichten erreicht ist, wird die Nachricht in die Warteschlange für nicht zustellbare Nachrichten verschoben. Hinweis: Auch wenn Sie über die aws-Konsole auf die Nachricht zugreifen, wird die Empfangszahl erhöht.

Quelle Using Amazon SQS Dead Letter Queues

Verwandte Themen