Django celery выполняет некоторое задание дважды

1. Вопрос 1. Некоторые задания выполняются дважды

  • логика задачи

    • settings.CELERYBEAT_SCHEDULE crontab -> create_course_reports -> create_course_report_pdf.apply_async (inside for-loop call multiple tasks) -> email/save pdf
  • проблемы (журнал сельдерея ниже)

    • f6cf7468-bec3-466c-877e-89d9064472b0 задание: выполнено 1 раз. нет проблем
    • 8812805b-65aa-4d28-8f71-490a655a1672 задание: выполнено 2 раза. получено 1 -> получено 2 -> выполняется 1 -> выполняется 2
    • c1931609-69c1-43c0-934c-97264f9afa82 задание: выполнено 2 раза. получил 1 -> выполнил 1 -> получил 2 -> выполнил 2
  • settings.CELERYBEAT_SCHEDULE

            {
                ...
                # create report
                "create-course-reports": {
                    "task": "hrd.emonitoring.tasks.create_course_reports",
                    "schedule": crontab(hour="7", minute="0"),
                },
                ...
            }
  • create_course_reports
@shared_task(bind=True)
def create_course_reports(self):
    ......
    ......
      # create report
      for _, course_id, email_time in filtered_courses:
          # eta
          eta = datetime.combine(today_min.date(), email_time, today_min.tzinfo)
          create_course_report_pdf.apply_async(
              eta=eta,
              kwargs={
                  "course": str(course_id),
                  "mode": "email",
                  "user": celerybeat_worker.id,
              },
          )
      # end
  • create_course_report_pdf
@shared_task
@transaction.atomic
def create_course_report_pdf(course, mode="preview", user=None):
    .....
    # 10s ~ 3m job
    .....
    return report_pdf, pdf.report_title
  • рабочая среда

    • signlebeat
    • django celery beat
    • celery 4.4.7
    • redis-server 5.0.7
  • worker

    • рабочий с одним ударом: single-beat celery beat ...
    • celery worker: celery --app=lms.celery:APP worker --loglevel=info --queues=edx.lms.core.default --hostname=edx.lms.core.default.%%h --concurrency=1 -O default
  • варианты транспортировки фарфора

{
    'fanout_patterns': True, 'fanout_prefix': True, 'visibility_timeout': 36000
}
  • журнал одиночных ударов
  • журнал сельдерея

2. Вопрос 2. Когда celery worker перезапускается, немедленно ли выполняется crontab?

  • settings.CELERYBEAT_SCHEDULE
            {
                # send message at 8:30 am
                "send-course-messages": {
                    "task": "hrd.emonitoring.tasks.enqueue_course_messages",
                    "schedule": crontab(hour="7", minute="30"),
                    "kwargs": {"send_time": dict(hour=8, minute=30)},
                },

            }
  • проблема
    • (Эта задача выполняется один раз. нет проблем.)
    • celery отправляет сообщения в 8:30 утра
    • Когда я перезапускаю рабочий в 11:00 утра, сельдерей повторно отправляет те же сообщения снова.
Вернуться на верх