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) |
如果您想要不断轮询队列,请尝试所谓的长轮询 - 您可以连续轮询最多20秒,并在填充队列时返回。
希望这有用,否则请浏览boto sqs文档。