关于python:使用boto处理SQS队列

Processing SQS queues with boto

我有一个python脚本使用ec2实例上的boto库,它是自动缩放组的一部分。该脚本处理来自SQS队列的消息:

1
2
3
4
5
6
7
8
9
import boto
from boto.sqs.message import Message

conn = boto.connect_sqs()
q = conn.create_queue('queue-name')

while (qin.count() > 0):
    m = q.get_messages()
    #do something with the message

使用while语句有意义吗? count()是否实时更新为:

  • 其他实例从队列中取消消息(或者我要加倍)
  • 新消息被添加到队列中(或者我会想念它们吗?)
  • 即使队列为空,如何使此脚本不断监听队列的新增内容?

    在这个问题处理带有php脚本的SQS队列中的项目时,提到'sqs ruby??客户端库有一个方法"轮询",它连续轮询队列并在队列中接收消息时将其传递给一个块'。 Python中有相应的东西吗?

    还有人建议SNS可用于通知脚本消息队列状态,但我不知道如何配置具有SNS的响应系统,因为度量标准报警不够精细。


    您不应该依赖队列的计数,因为它只是为了提供近似计数而不保证准确。

    如果您想永远保持轮询,请执行以下操作:

    1
    2
    3
    4
    while 1:
        messages = q.get_messages()
        # do something with messages
        time.sleep(N)

    我已经添加了对time.sleep的调用以在循环中引入延迟。 N的值应该至少为一秒,并且可能会更多,具体取决于您期望新消息在队列中出现的速度。如果你没有在循环中加入某种延迟,你可能会开始受到服务的限制。

    为避免多次读取消息,您应尝试将队列的可见性超时调整为大于处理消息所用时间的值,然后确保在处理完成时删除消息。


    例:

    1
    2
    3
    4
    5
    6
    7
    8
    # wait_time_seconds count only 1 request in x seconds (0 - 20)
    # num_messages get x messages in same request (1 - 10)
    while 1:
        logger.info("... waiting messages ...")
        messages = queue_in.get_messages(wait_time_seconds=20, num_messages=10)
        for message in messages:
            logger.info('message: %s' % (message,))
            queue_in.delete_message(message)


  • 当您从SQS中提取消息时,该消息将变为不可见且其他队列查询无法访问(编辑 - 不可见性可在0到12小时之间设置)。
  • 每次添加新消息时都必须再次获取队列,但这不应该是一个问题 - 这就是排队服务首先存在的原因。
  • 如果您想要不断轮询队列,请尝试所谓的长轮询 - 您可以连续轮询最多20秒,并在填充队列时返回。

    希望这有用,否则请浏览boto sqs文档。