2016-12-23 4 views
0

Большинство моих задач Celery имеют ETA дольше максимального максимального времени видимости, определенного Amazon SQS.Сельдерей SQS + Дублирование заданий + Тайм-аут видимости SQS

сельдерея documentation говорит:

Это вызывает проблемы с ETA/обратный отсчет/повторами задач, где время выполнения превышает таймаут видимости; на самом деле, если это произойдет, то будет выполнен снова и снова в цикле.

Таким образом, вам необходимо увеличить тайм-аут видимости, чтобы соответствовать времени самой длинной ETA, которую вы планируете использовать.

В то же время он также говорит, что:

Максимальный таймаут видимости поддерживается AWS от написания этой статьи 12 часов (43200 секунд):

Что я должен сделать, чтобы избежать многократного выполнения задач у моих работников, если я использую SQS?

ответ

2

Как правило, это не очень хорошая идея иметь задачи с очень длинными ETA.

Прежде всего, существует проблема «visibility_timeout». И вы, вероятно, не хотите очень большой тайм-аут видимости, потому что, если рабочий сработает за 1 минуту до того, как задача вот-вот начнется, очередь будет по-прежнему ждать завершения видимости_timeout перед отправкой задачи другому работнику, и, я думаю, вы не хотите это будет еще 1 месяц.

От сельдерея Документов

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

А также, SQS допускает, что в списке должно быть столько задач.

SQS называет эти задачи «Сообщениями о вспышках». От http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html:

сообщение считается находящимся в полете после того, как он получил от очереди потребителем, но не удаляется из очереди.

Для стандартных очередей может быть не более 120 000 информационных потоков сообщений в очереди. Если вы достигнете этого предела, Amazon SQS вернет сообщение об ошибке OverLimit. Чтобы избежать ограничения, вы должны удалить сообщения из очереди после их обработки. Вы можете также увеличить количество очередей, используемых для обработки сообщений.

Для очередей FIFO может быть не более 20 000 сообщений в полете в очереди. Если вы достигнете этого предела, Amazon SQS не возвращает сообщение об ошибке .

Я вижу два возможных решения, вы можете использовать либо RabbitMQ вместо этого, который не делает полагаться на видимость тайм-аута (есть «RabbitMQ как сервис» услуги, если вы не хотите, чтобы управлять самостоятельно) или изменить свой код, чтобы иметь действительно небольшие ETA (лучшая практика)

Это мои 2 цента, возможно, @asksol может предоставить дополнительную информацию.

+0

Моя предыдущая настройка была с таймаутами видимости = 5 минут. После создания задачи он был добавлен в очередь для выполнения (скажем, с ETA в течение 6 часов). То, что произошло дальше, меня удивило. В журналах я видел, что новая задача добавляется в очередь на сервере каждые пять минут. И я подозреваю, что все собранные задания будут выполнены через 6 часов один за другим. Вот почему я решил увеличить тайм-аут видимости. Да, если рабочий сработает, задача redeliverd будет опоздана, но по крайней мере в рабочем журнале будет 1 задача, а не 1000 из них. Если я не буду думать правильно, пожалуйста, поправьте меня. –

+1

Ожидается, что новая задача будет выполняться каждые 5 минут, так как это был тайм-аут видимости. Это означает, что если работник не начал выполнять эту задачу за 5 минут, SQS считает, что работник пропустил эту задачу, поэтому SQS перенесет ее на другой рабочий. Увеличение тайм-аута видимости - это решение этой проблемы, хотя оно также имеет свои собственные компромиссы. – giorgosp

+0

У меня есть два вопроса. Во-первых, использование SQS у меня нет других средств для управления очередью, кроме журнала. Поэтому я предполагаю, что все задачи, перечисленные в журнале очереди, будут выполнены. Это правда? Или сельдерей проверяет идентификатор задачи перед исполнением? Второй: теперь у меня только одна очередь на одном сервере. Что произойдет, если брокер SQS отправит ту же задачу рабочему на другом сервере? Как вы думаете, будет ли он выполнен дважды? –

 Смежные вопросы

  • Нет связанных вопросов^_^