Обработка очередей SQS с помощью boto

У меня есть скрипт python, использующий библиотеку boto на экземпляре ec2, который является частью группы автомасштабирования. Скрипт обрабатывает сообщения из очереди 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

Имеет ли смысл использование оператора while? Обновляется ли count() в режиме реального времени как:

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

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

В этом вопросе обработка элементов в очереди SQS с помощью php-скрипта было упомянуто, что «клиентская библиотека sqs ruby ​​​​имеет метод «опрос», который непрерывно опрашивает очередь и при получении сообщения в очереди передает его блоку». Есть ли аналог в Python?

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


person waigani    schedule 21.06.2012    source источник
comment
Вы знаете, какая рубиновая библиотека? Я хотел бы взглянуть на это   -  person Hassek    schedule 21.06.2012
comment
нет, извините, я видел это только в вопросе, указанном выше.   -  person waigani    schedule 21.06.2012
comment
Checkout SNS - лучше нажать, чем тянуть. и они очень хорошо работают вместе docs.aws.amazon.com/sns/ последний/dg/SendMessageToSQS.html   -  person Gal Bracha    schedule 21.06.2014


Ответы (3)


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

Если вы хотите просто продолжать опрос вечно, просто сделайте следующее:

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

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

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

person garnaat    schedule 21.06.2012

Пример:

# 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)
person raulfortes    schedule 08.01.2016

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

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

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

person tyleha    schedule 14.11.2012
comment
Невидимость сообщения по умолчанию составляет 30 секунд, а не 4 дня. И этот период можно изменить. - person Jan Vlcinsky; 09.01.2014