Comment obtenir tous les messages dans la file d'attente Amazon SQS à l'aide de boto bibliothèque en Python?
Je travaille sur une application dont le flux de travail est géré par la transmission de messages dans SQS, à l'aide de boto.
Ma file d'attente SQS est croissant progressivement, et je n'ai aucun moyen de vérifier combien d'éléments il est censé contenir.
Maintenant, j'ai un démon qui vérifient périodiquement la file d'attente, et vérifie si j'ai une taille fixe de l'ensemble des éléments. Par exemple, considérons la suite de "file d'attente":
q = ["msg1_comp1", "msg2_comp1", "msg1_comp2", "msg3_comp1", "msg2_comp2"]
Maintenant, je veux vérifier si j'ai "msg1_comp1", "msg2_comp1" et "msg3_comp1" dans la file d'attente, ensemble, à un certain point dans le temps, mais je ne sais pas la taille de la file d'attente.
Après la recherche par le biais de l'API, il semble que vous pouvez obtenir seulement 1 élément, ou un nombre fixe d'éléments dans la file d'attente, mais pas tous:
>>> rs = q.get_messages()
>>> len(rs)
1
>>> rs = q.get_messages(10)
>>> len(rs)
10
Une suggestion proposée dans les réponses serait d'obtenir par exemple de 10 messages dans une boucle jusqu'à ce que je obtenir rien en retour, mais les messages dans SQS avoir une visibilité délai d'attente, ce qui signifie que si je le sondage, les éléments de la file d'attente, ils ne sont pas réellement supprimés, ils ne seront invisibles pour une courte période de temps.
Est-il un moyen simple d'obtenir tous les messages dans la file d'attente, sans savoir combien il y a?
OriginalL'auteur Charles Menguy | 2012-04-16
Vous devez vous connecter pour publier un commentaire.
Mettre votre appel à
q.get_messages(n)
à l'intérieur de la boucle while:En outre, dump ne prend pas en charge plus de 10 messages:
dump()
mais je vais devoir lire le fichier une fois, cela semble idiot, suis-je raté quelque chose? (Je pourrais définir le visibility_timeout pour un temps très long, mais qui semble laid).vous avez dit que vous devez vérifier pour 'n' des messages spécifiques. est-ce à dire qu'il y a certains critères de correspondance pour lequel vous êtes en comparant chaque message?
Désolé si c'est confus, j'ai mis à jour mon post.
Selon la référence, la visibilité de la temporisation peut être jusqu'à 12 heures. Sauf si vous êtes le coup d'envoi massif EC2 travail, je devine que ce serait répondre à vos besoins? docs.amazonwebservices.com/AWSSimpleQueueService/2011-10-01/...
btw, le nombre de messages est supposé être de 1 à 10. Si vous utilisez autre chose, la SQS service retourne un
ReadCountOutOfRange
erreur.OriginalL'auteur AJ.
J'ai travaillé avec AWS files d'attente SQS pour fournir des notifications instantanées, donc j'ai besoin de traiter tous les messages en temps réel. Le code suivant va vous aider efficacement dequeue (tous) les messages et gérer les erreurs lors de la dépose.
Remarque: pour supprimer les messages de la file d'attente, vous devez les supprimer. Je suis à l'aide de la mise à jour boto3 AWS SDK python, librairie json, et les valeurs par défaut suivantes:
Boto
paquets "backport" ladelete_messages
fonction deBoto3
est ici. Le haut-Boto
(2)delete_message_batch
a une limite de 10 messages ET exige la pleineMessage
-les objets de la classe, plutôt que de simplement leID
etReceiptHandles
dans un objet.OriginalL'auteur Timothy Liu
Ma compréhension est que la nature distribuée de la SQS service assez bien fait votre conception impraticable. Chaque fois que vous appelez get_messages que vous parlez à un ensemble différent de serveurs, ce qui permettra de certains, mais pas tous de vos messages. Il n'est donc pas possible de vérifier de temps en temps " pour définir si un groupe particulier de messages sont prêts, et puis il suffit de l'accepter.
Ce que vous devez faire est de sondage en continu, prendre tous les messages dès qu'ils arrivent, et les stocker localement dans vos propres structures de données. Après chaque extraction, vous pouvez vérifier vos structures de données pour voir si un jeu complet de message a été recueilli.
Garder à l'esprit que les messages sera arriver en dehors de l'ordre, et certains messages sera être livrés deux fois, comme des suppressions ont à se propager à l'ensemble de la SQS serveurs, mais à la suite des demandes parfois battu le supprimer des messages.
OriginalL'auteur Jeff
J'exécute ce dans un cronjob
OriginalL'auteur Karl Zillner
Quelque chose comme le code ci-dessous devrait faire l'affaire. Désolé c'est en C#, mais il ne devrait pas être difficile de convertir à python. Le dictionnaire est utilisé pour éliminer les doublons.
OriginalL'auteur Timothy Gonzalez
REMARQUE: Ce n'est pas conçue comme une réponse directe à la question.
C'est plutôt une augmentation de @TimothyLiu réponse, en supposant que l'utilisateur final à l'aide de la
Boto
paquet (aka Boto2) pasBoto3
. Ce code est un "Boto-2-isation" de ladelete_messages
appel visé au sa réponseUn
Boto
(2) appel d'delete_message_batch(messages_to_delete)
oùmessages_to_delete
est undict
objet avec clé:valeur correspondant àid
:receipt_handle
paires retourneIl semble
delete_message_batch
s'attend à unMessage
objet de classe; la copie de l' Boto source pourdelete_message_batch
et lui permettant d'utiliser un non-Message
objet (ala boto3) échoue également si vous êtes à la suppression de plus de 10 "messages" à la fois. Donc, j'ai dû utiliser la solution de contournement.eprint code de ici
OriginalL'auteur mpag