使用boto处理SQ​​S队列

wai*_*ani 9 python boto amazon-sqs amazon-web-services

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

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
Run Code Online (Sandbox Code Playgroud)

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

  1. 其他实例从队列中取消消息(或者我要加倍)
  2. 新消息被添加到队列中(或者我会想念它们吗?)

即使队列为空,如何使此脚本不断监听队列的新增内容?

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

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

gar*_*aat 7

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

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

while 1:
    messages = q.get_messages()
    # do something with messages
    time.sleep(N)
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

例子:

# 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)
Run Code Online (Sandbox Code Playgroud)