2016-10-31 1 views
0

J'utilise le client boto3 en python. Je suis en train de pousser les messages vers les carrés mais je les reçois dans le mauvais ordre. Je peux voir que leur heure d'envoi est correcte.Messages SQS reçus en désordre

La file d'attente est créée comme ça:

boto_session = boto3.Session(region_name=..,aws_access_key_id=..,          aws_secret_access_key=...) 
sqs_client = boto_session.resource('sqs', endpoint_url=endpoint_url) 
sqs_client.create_queue(QueueName=...) 

Le code pour pousser les messages:

boto_session = boto3.Session(region_name=..,aws_access_key_id=..,aws_secret_access_key=...) 
sqs_client = boto_session.resource('sqs', endpoint_url=endpoint_url) 
queue = sqs_client.get_queue_by_name(QueueName=stream_name) 

i = 0 
while i < 10: 
    print 'b ' + str(i) 
    queue.send_message(MessageBody=raw_data.push(json.dumps(dict(id=i))) 
    sleep(2) 
    i += 1 

et le code pour les messages de vote:

sqs_resource = boto_session.resource('sqs', endpoint_url=endpoint_url) 
queue = sqs_resource.get_queue_by_name(QueueName=queue_name) 

while True: 
    messages = queue.receive_messages(MaxNumberOfMessages=1,VisibilityTimeout=10,WaitTimeSeconds=5) 
    for m in messages: 
     print m.data 
     queue.delete_messages(
       Entries=[ 
        { 
         'Id': m.message_id, 
         'ReceiptHandle': m.receipt_handle 
        } 
       ] 
      ) 

J'ai couru la création d'un code de file d'attente , puis j'ai poussé les messages, puis a couru un processus pour consommer les messages comme indiqué.

Je vois clairement que les messages sont triés au hasard.

Existe-t-il une solution pour cela en m²? ou devrais-je remplacer la file d'attente?

+0

Le comportement est techniquement valide, mais définir MaxNumberOfMessages à 1 et WaitTimeSeconds <20 est probablement exagérer ce que vous voyez ...car en faisant cela lorsque la file d'attente est préchargée de messages, vous installez par inadvertance un "J'ai besoin de travail, alors donnez-moi quelque chose, n'importe quoi, rapidement" le premier message est susceptible d'être sélectionné plus aléatoirement que ce serait dans les opérations normales. Réglez-le à 10 et voir ce qui se passe. Essayez également de démarrer votre client séparément, et laissez-le fonctionner pendant que vous exécutez le producteur et notez vos observations, avec max 1 et max 10. –

+0

J'ai déjà essayé dix et j'ai essayé de changer le temps max, rien n'y fait. – user2283268

Répondre

3

SQS ne garantit pas la commande de messages. Il est préférable d'écrire votre code d'une manière qui l'accepte ou de passer à un système de file d'attente que fait si vous en avez absolument besoin.

Documentation se trouve here, le passage en question est:

si je veux que les messages à livrer en ordre? Amazon SQS fait de son mieux pour préserver l'ordre dans les messages, mais en raison de la nature distribuée de la file d'attente, nous ne pouvons pas garantir que vous recevrez des messages dans l'ordre exact dans lequel vous les avez envoyés. Vous placez généralement des informations de séquençage ou des horodatages dans vos messages afin de pouvoir les réorganiser dès leur réception.

+1

Oui, mais le meilleur effort devrait s'appliquer pour dix messages poussés avec des intervalles de deux secondes. Comment puis-je le faire manuellement? J'ai essayé de changer le nombre maximum de messages, le maximum est 10, et j'ai reçu 3. – user2283268

1

Si vous 100% besoin d'un service qui conserve l'ordre des messages, vous pouvez utiliser Amazon Kinesis.

Un flux Amazon Kinesis est une séquence ordonnée d'enregistrements de données. L'ordre des enregistrements est conservé lorsque les données sont récupérées et les enregistrements peuvent être reçus par plusieurs applications. Cela diffère d'une file d'attente Amazon SQS, où l'ordre des messages est non garanti et, une fois consommés, les messages disparaissent de la file d'attente. La consommation de messages à partir d'Amazon Kinesis est plus complexe que la récupération de messages à partir d'une file d'attente Amazon SQS, mais elle peut mieux répondre à vos besoins.

Voir: Amazon Kinesis Streams Key Concepts