2012-08-10 12 views
7

Używam biblioteki boto w Pythonie, aby otrzymywać wiadomości Amazon SQS. W wyjątkowych przypadkach nie usuwam wiadomości z kolejki, aby wprowadzić kilka dodatkowych zmian, aby odzyskać tymczasowe awarie. Ale nie chcę ciągle otrzymywać nieprzeczytanych wiadomości. Chciałbym usunąć wiadomości po otrzymaniu więcej niż 3 razy lub nie otrzymać wiadomości, jeśli liczba otrzymanych wiadomości przekroczy 3. 3.Jak uzyskać liczbę otrzymanych wiadomości w Amazon SQS za pomocą biblioteki boto w Pythonie?

Jaki jest najbardziej elegancki sposób robienia tego?

Odpowiedz

3

Istnieje co najmniej kilka sposobów na zrobienie tego.

Po przeczytaniu wiadomości w boto, otrzymasz obiekt Message lub jego podklasę. Obiekt Message ma pole "attributes", które jest dyktando zawierającym wszystkie atrybuty wiadomości znane przez SQS. Jedna ze ścieżek SQS to przybliżona liczba razy, gdy wiadomość została przeczytana. Tak więc możesz użyć tej wartości, aby określić, czy wiadomość ma zostać usunięta, czy nie, ale musisz mieć pewność, że wartość jest "przybliżona".

Można również zapisać identyfikator wiadomości w bazie danych i zwiększyć pole licznika w bazie danych przy każdym odczytaniu wiadomości. Można to zrobić za pomocą prostego polecenia Pythona, jeśli wiadomości są zawsze odczytywane w ramach jednego procesu lub można to zrobić w sposób podobny do SimpleDB, jeśli trzeba rejestrować odczyty między procesami.

Nadzieję, że pomaga.

Oto niektóre przykładowy kod:

>>> 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

dzięki za odpowiedź. Przeszukałem dokumentację boto, ale nie znalazłem żadnej wskazówki, aby uzyskać liczbę otrzymanych wiadomości. Czy wiesz gdzie to jest? Przy okazji posiadanie prostej lokalnej bazy danych to mój alternatywny sposób zarządzania tym problemem, ale najpierw chciałbym, aby było to proste - jak uzyskiwanie odliczeń - jeśli to możliwe .. – huzeyfe

+0

Czy możesz dodać przykład składni? Wszystko, co znajduję, to pusty słownik, gdy czytam wiadomość więcej niż jeden raz i patrzę na message_instance.attributes. – tponthieux

1

To powinno odbywać się w kilku etapach.

  1. utworzyć połączenie SQS: - sqsconnrec = SQSConnection (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
  2. tworzą przedmiot kolejki: - request_q = sqsconnrec.create_queue ("nazwa_kolejki")
  3. obciążenia wiadomości kolejki: - wiadomości = request_q.get_messages()
  4. teraz masz tablica wiadomości obiektów oraz wyszukiwanie całkowitą liczbę komunikatów: - prostu zrobić DŁ (wiadomości)

powinien działać jak urok.

+0

Dziękuję za uwagę, ale obawiam się, że to nie była moja sprawa. Nie potrzebuję len (wiadomości) Potrzebuję liczby odbieranych wiadomości. – huzeyfe

+1

tak, nie ma zdefiniowanej funkcji w boto, aby uzyskać liczbę odbierającą. Sugerowałbym, abyś utrzymywał lokalną krotkę, która będzie miała identyfikator wiadomości, liczbę haseł i treść wiadomości. ładujesz wiadomości z kolejki po pewnym czasie, sprawdź, czy identyfikator jest obecny w krotce, jeśli tak, zwiększ liczbę odbieranych wiadomości, jeśli liczba odbierająca> 3, możesz usunąć wiadomość. Widziałem katalog obiektu wiadomości i nie ma on funkcji licznika odbierania. Mam nadzieję, że pomoże to Twojemu problemowi. –

+0

To było alternatywne rozwiązanie, chyba na razie mam tylko tę opcję. Wielkie dzięki .. – huzeyfe

4

Innym sposobem może być umieszczenie dodatkowego identyfikatora na końcu wiadomości w kolejce SQS. Ten identyfikator może zachować liczbę razy, gdy wiadomość została przeczytana.

Jeśli chcesz, aby twoja usługa nie odpytywała raz po raz, możesz utworzyć kolejną kolejkę, powiedz "Kolejka wiadomości martwych" i przesłać wiadomość, która przekroczyła próg tej kolejki.

1

Uzyskaj atrybut ApproximateReceiveCount z przeczytanej wiadomości. przenieść go do kolejnej kolejki (można zarządzać komunikatami o błędach) lub po prostu go usunąć.

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 został zbudowany w-wsparcie dla tego, po prostu wykonaj poniższe czynności:

  1. tworzyć martwą literą kolejkę
  2. włączyć politykę Redrive dla kolejki źródłowej zaznaczając "Use Policy Redrive"
  3. wybrać utworzony w kroku 1 dla „martwą literą” kolejka
  4. Set „Maksymalna odbiera” jako „3” lub dowolnej wartości między 1 a 1000
  5. martwego się kolejki

Sposób działania polega na tym, że po odebraniu wiadomości przez pracownika liczba wyświetleń wzrasta. Po osiągnięciu liczby "Maksymalna liczba odebranych" wiadomość jest przekazywana do kolejki wiadomości utraconych. Uwaga, nawet jeśli uzyskasz dostęp do wiadomości poprzez konsolę aws, liczba odbiera wzrasta.

Źródło Using Amazon SQS Dead Letter Queues

Powiązane problemy