Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумСбор данных

Очередь задач и повторы: схема с растущей паузой

queue_master
queue_master
Участник
сообщений 410
с ноя
8 февраля, 11:37первое сообщение

Собираю карточки пачками, очередь лежит в базе. Задача упала, кладу её обратно в хвост, беру следующую. Пока сайт живой, всё едет.

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

Хочу паузу, которая растёт после каждого промаха. Вопрос в цифрах. С чего начинать, до какого потолка расти, сколько попыток держать, прежде чем отложить задачу насовсем?

очередь длиннее памяти
zavarka
zavarka
Участник
сообщений 435
с ноя
15 июля, 14:54#2

Начинай с секунды, дальше удваивай. Потолок пять минут, попыток шесть. После шестой сайт либо лёг целиком, либо тебя видеть не хочет, и повторы тут уже не помогут.

чайник кипит, скрипт бежит
Артём Пчёлкин
Артём Пчёлкин
Ветеран
сообщений 2310
с янв
22 декабря, 17:11#3

Удвоение работает, но голое удвоение даёт эффект стада: все упавшие задачи просыпаются одной секундой и бьют по сайту разом. Поэтому к паузе добавляют разброс.

import random, time

def pauza(popytka, baza=1.0, potolok=300): t = min(baza * 2 ** popytka, potolok) return t * random.uniform(0.7, 1.3)

# popytka=0 -> ~1 c, 1 -> ~2 c, 2 -> ~4 c ... 8 -> потолок ```

Множитель от 0.7 до 1.3 размазывает пробуждения, и очередь перестаёт дышать толчками.

queue_master
queue_master
Участник
сообщений 410
с ноя
1 мая, 08:28#4
zavarka: после шестой сайт либо лёг целиком

Вот тут и вопрос: как отличить «лёг целиком» от «эта одна карточка битая»? У меня в очереди и то и другое лежит вперемешку.

очередь длиннее памяти
zavarka
zavarka
Участник
сообщений 435
с ноя
8 октября, 11:45#5

По коду ответа и по соседям. Пятисотые и таймауты это сайт, четыреста четвёртый это карточка. И считай долю падений за последнюю минуту по всей очереди: если она за половину перевалила, дело не в задачах.

чайник кипит, скрипт бежит
anton_zzz
anton_zzz
Новичок
сообщений 96
с июн, второй сезон
15 марта, 14:02#6

а куда девать задачу после шестой попытки? удалять жалко

iron_shell
iron_shell
Знаток
сообщений 1050
с июн
22 августа, 17:19#7

Не удалять. Заводи вторую очередь, отложенную, и клади туда всё, что исчерпало попытки, вместе с последним кодом ответа и временем.

У меня отложенная разгребается отдельным прогоном раз в сутки, обычно под утро, когда основной поток уже отработал. Три четверти таких задач проходят с первого раза: сайт к тому моменту починился, разметка вернулась, лимит частоты сбросился. Остаток, который не прошёл и в отложенном прогоне, попадает в список на глаза, и вот его я смотрю руками. Обычно там пять или шесть штук на всю ночь, и разбор занимает десять минут.

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

пауза перед попыткой, секунды
пауза перед попыткой, секунды
Дарья Смолина
Дарья Смолина
Участник
сообщений 340
с дек
1 января, 08:36#8

Плюсую про контекст. Я в задачу пишу три поля: сколько было попыток, код последнего ответа, отметка времени следующего запуска. Тогда выборка из очереди становится обычным запросом.

SELECT * FROM ochered
WHERE sleduyushchiy_zapusk <= NOW()
ORDER BY prioritet DESC, sleduyushchiy_zapusk
LIMIT 200;

Задача, у которой время ещё не пришло, просто не попадает в выборку, и никакого холостого вращения нет.

queue_master
queue_master
Участник
сообщений 410
с ноя
8 июня, 11:53#9

Понял свою ошибку: у меня не было поля со временем следующего запуска, я просто перекладывал в хвост. Отсюда и карусель.

Переписал выборку по образцу Дарьи, добавил разброс по совету Артёма.

очередь длиннее памяти
Артём Пчёлкин
Артём Пчёлкин
Ветеран
сообщений 2310
с янв
15 ноября, 14:10#10

Разброс обязателен, иначе потолок вас догонит на любом объёме.

queue_master
queue_master
Участник
сообщений 410
с ноя
22 апреля, 17:27#11

Сутки отработало. Холостых заходов ноль, отложенных за ночь семнадцать штук, из них утром прошло четырнадцать. Три карточки правда битые, их со стороны сайта уже нет.

Спасибо, схема встала.

очередь длиннее памяти