Size: a a a

2021 August 16

DV

Dmitry Viskov in rannts
вообще я так понял они эту настройку добавили чтобы зомбарей детектить и отключать автоматически
источник

DV

Dmitry Viskov in rannts
хотели из лучших побуждений, но досталось всем
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Вот как у нас добавляется в "таску" время её старта (мы его используем для логирования того, сколько таска просидела в очереди)
@before_task_publish.connect
def add_params_to_task(sender=None, body=None, **kwargs):
   if isinstance(body, tuple):
       embed = body[2]
       extra = {
           'task_added': time.time(),
       }
       embed[MOUNTBIT_EXTRA_NAME] = extra
источник

KK

Kirill (Cykooz) Kuzm... in rannts
А потом в самой таске (self) вот так достаём этот словарик
extra = getattr(self.request, MOUNTBIT_EXTRA_NAME, {})
источник

DV

Dmitry Viskov in rannts
ну все эти манипуляции с датами руками - такое себе.
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Ну в самом Реббите нет поодержи "отложенных" сообщений. Поэтому то что сделано в Celery - это считай костыль.
источник

DV

Dmitry Viskov in rannts
ну у меня видишь - нет задачи логировать время, я просто хочу ошибку побороть.
ладно, наверное так и придется просто увеличить `consumer_timeout` - самое простое решение
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Ещё другой вариант - сохраняешь в базе свою "таску". Делаешь крон-таску на целери. Которая раз в 10 минут выгребает из базы таски, которые надо запустить в ближайшие 15 минут, и кидаешь их в очередь с соответствующим ETA и удаляешь из базы (или помечаешь как отправленные)
источник

DV

Dmitry Viskov in rannts
кстати да, звучит неплохо
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Время добавления таски в очередь можно не использовать, если не нужна сильная точность с временем запуска. Можно просто из "рального" ETA вычитать фиксированное время, на которое ты можешь таску отправить в очередь без разрывов.
источник

SA

Sergey Arkhipov in rannts
То есть хранить время в таске - это так себе, а делать рядом с селери "селери на кроне" - это ок?
источник

DV

Dmitry Viskov in rannts
Да не, согласен - оба решения не очень. И переделывать много
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Задержка в 3 часа - это вообще больше похоже на чистую крон-таску.
Можно даже проще сделать - запускать таску раз в 10 минут, и выполнять все "задачи" из базы данных, которые должны быть выполнены. Если нужна более высокая точность времени выполнения - запускать крон-таску чаще.
источник

AZ

Alexander Zelenyak in rannts
У меня бывали ETA на несколько месяцев вперёд...   🙂
источник

AZ

Alexander Zelenyak in rannts
И оно с редисом нормально работало.
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Персистентный редис - это какой-то редкий и не надёжный фрукт. 😊
источник

AZ

Alexander Zelenyak in rannts
Года четыре в продакшене отпахало. Проблем не было.
источник

AZ

Alexander Zelenyak in rannts
Даже пять.
источник

AZ

Alexander Zelenyak in rannts
Потом перелезли на яндексовую очередь, а там было ограничение на время жизни сообщения. Пришлось сделать нормально, кронджобой, которая создаёт таски на час вперёд.
источник

AZ

Alexander Zelenyak in rannts
В общем, хорошее решение, это хорошо, но если бы мы сразу хорошо делали, то проект бы давно помер.   🙂
источник