Python 2.7 从AWS FIFO SQS获取所有消息

Python 2.7 从AWS FIFO SQS获取所有消息,python-2.7,amazon-web-services,boto3,amazon-sqs,fifo,Python 2.7,Amazon Web Services,Boto3,Amazon Sqs,Fifo,我正在尝试从FIFO sqs队列获取消息。以下是示例代码: import boto3 sqs_client = boto3.resource( 'sqs', #aws_access_key_id=AWS_ACCESS_KEY, #aws_secret_access_key=AWS_SECRET_ACCESS_KEY, region_name='us-east-2' ) queue_name = 'test_queue.fifo' response =

我正在尝试从FIFO sqs队列获取消息。以下是示例代码:

import boto3

sqs_client = boto3.resource(
    'sqs',
    #aws_access_key_id=AWS_ACCESS_KEY,
    #aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
    region_name='us-east-2'
    )

queue_name = 'test_queue.fifo'

response = sqs_client.create_queue(
    QueueName=queue_name,
    Attributes={
        'FifoQueue': 'true',
        'ContentBasedDeduplication': 'true'
        }
        )


for i in range(0,50):
    status = response.send_message(MessageBody = 'This is test message #'+str(i), MessageGroupId='586474de88e03')

while True:
    messages = response.receive_messages(MaxNumberOfMessages=10)
    if len(messages)>0:

        for message in messages:
            print message.body

    else:

        print('Queue is now empty')
        break
但是我得到的只是前10条消息,然后它的显示队列现在是空的,尽管我可以从AWS控制台看到队列中有40条可用消息


所以这里我想从循环中的队列中获取所有消息。任何线索都将不胜感激。谢谢。

当SQS队列中有少量消息时,尤其是在您的情况下,数量非常少,您可能无法收到任何返回的消息,可能需要重试呼叫:

短轮询是默认行为,在接收消息调用时对加权随机机器集进行采样。因此,仅返回采样机器上的消息。如果队列中的消息数小于1000,则每次接收消息调用收到的消息很可能少于请求的消息数。如果队列中的消息数量非常少,则可能无法在特定的接收消息响应中接收任何消息。如果发生这种情况,请重复该请求


另外,一般来说,一旦您收到一组消息,您将对它们进行处理,然后删除您处理的消息-出于测试目的,至少您可能希望在每个“print message.body”之后删除每个返回的消息,在您发出下一个接收请求之前。

您的问题:我想从循环队列中获取所有消息。。。。。。。。。。。。。。我的回答是:请仔细阅读fifo队列。阅读该消息,然后将该消息发送回该队列,并将其从队列中删除。。。。只有使用适当的异常处理程序和消息处理程序,这才是安全的。尝试使用适当的记录器编写python程序,并使其具有故障安全性。实际上你的电脑不是自动防故障的

谢谢你的解释。如果我将可见性超时设置得很高,那么在不删除之前收到的消息的情况下,是否可以读取其他消息?这不是本例中的解释,@EJBrennan。FIFO队列是为了防止无序处理而设计的,因此在您删除已经收到的消息之前,它不会给您提供更多消息。@Michael sqlbot如果我必须在收到消息后删除消息才能获得下一条消息,那么可见性超时有什么意义?位混乱由于HTTP/S是无状态的,连接不会将消息绑定到特定的使用者,并且可见性超时会将已接收到的消息对所有使用者隐藏足够长的时间,以便使用者处理消息,如果失败/崩溃/挂起等,最终使它们再次可见,以便您或其他消费者可以重试。FIFO队列的一个核心假设是,在请求更多消息之前,您计划按顺序处理消息,并在处理完毕后将其删除。重读