2012-06-21 4 views
8

У меня есть скрипт python с использованием библиотеки boto на экземпляре ec2, который является частью группы автомасштабирования. Сценарий обрабатывает сообщения из очереди SQS:Обработка очередей SQS с boto

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() обновление в режиме реального времени (? Или я их не хватает)

  1. другие случаи принимать сообщения из очереди (или я собираюсь удвоить)
  2. новые сообщения добавляются в очередь

Как заставить этот скрипт постоянно слушать новые добавления в очередь, даже если очередь пуста?

В этом вопросе Processing items in SQS queue with a php script было упомянуто, что «клиентская библиотека sqs ruby ​​имеет метод« poll », который непрерывно обследует очередь и при получении сообщения в очереди передает его на блок». Есть ли эквивалент в Python?

Было также высказано предположение, что SNS может использоваться для уведомления о сценариях состояния очереди сообщений, но я не вижу, как вы можете настроить чувствительную систему с помощью SNS, поскольку метрические сигналы тревоги недостаточно мелкие.

+0

вы знаете, какие библиотеки Ruby? Я бы хотел взглянуть на это – Hassek

+0

nop sorry, я только видел это в связанном выше вопросе. – waigani

+0

Оформление заказа SNS - лучше нажать, чтобы потянуть. и они отлично работают вместе http://docs.aws.amazon.com/sns/latest/dg/SendMessageToSQS.html –

ответ

6

Вы не должны полагаться на счетчик очереди, поскольку он предназначен только для приблизительного подсчета и не гарантируется точность.

Если вы просто хотите сохранить опрос навсегда, просто сделать это:

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

Я добавил вызов time.sleep ввести задержку в петле. Значение N должно быть не менее одной секунды и может быть значительно больше, в зависимости от того, как быстро вы ожидаете появления новых сообщений в очереди. Если вы не поместите какую-то задержку в цикле, вы, вероятно, начнете получать дросселирование службы.

Чтобы избежать многократного чтения сообщения, вы должны попытаться настроить тайм-аут видимости очереди как значение, большее, чем время, необходимое для обработки сообщения, а затем убедитесь, что вы удалили сообщение, когда обработка завершено.

3
  1. Когда вы вытаскиваете сообщение из SQS, сообщение становится невидимым и недоступным для других запросов в очереди (редактирование - невидимость может устанавливаться между 0 и 12 часами).
  2. Вам нужно будет получить очередь снова при каждом добавлении новых сообщений, но это не должно быть проблемой - поэтому служба обслуживания очередей существует в первую очередь.

Если вы хотите постоянно опрашивать очередь, попробовать то, что называется Long Polling - вы можете иметь непрерывный опрос до 20 секунд, что возвращается, когда очередь заполняется.

Надеюсь, что это полезно, в противном случае тыкать вокруг boto sqs documentation.

+0

Невидимая сообщение по умолчанию 30 секунд, а не 4 дня. И этот период может быть изменен. –

2

Пример:

# 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) 
Смежные вопросы