모델이 있다고 가정합니다 Event
. 이벤트가 경과하면 초대 된 모든 사용자에게 알림 (이메일, 푸시 등)을 보내려고합니다. 다음과 같은 내용이 있습니다.
class Event(models.Model):
start = models.DateTimeField(...)
end = models.DateTimeField(...)
invited = models.ManyToManyField(model=User)
def onEventElapsed(self):
for user in self.invited:
my_notification_backend.sendMessage(target=user, message="Event has elapsed")
물론, 중요한 부분은 onEventElapsed
언제 라도 호출하는 것 timezone.now() >= event.end
입니다. 명심 end
떨어져 현재 날짜에서 달 수 있습니다.
나는 이것을하는 두 가지 기본 방법에 대해 생각했습니다.
cron
지난 5 분 내에 이벤트가 경과했는지 확인하고 내 메소드를 실행 하는 주기적 작업 (예 : 5 분마다)을 사용하십시오.나중에 실행될 모델을 사용하여 매개 변수를 사용
celery
하고 스케줄 하십시오 .onEventElapsed
eta
save
옵션 1을 고려하면 가능한 해결책은 다음과 같습니다 django-celery-beat
. 그러나 알림을 보내기 위해 일정 간격으로 작업을 실행하는 것은 약간 이상합니다. 또한 (아마도) 우아하지 않은 해결책을 초래할 수있는 (잠재적) 문제를 생각해 냈습니다.
- 지난 5 분 동안 경과 한 이벤트가 있는지 5 분마다 확인 하시겠습니까? 흔들리는 것처럼 보일 수 있습니다. 일부 이벤트가 누락되었거나 다른 알림이 두 번 전송됩니다. 잠재적 해결 방법 :
True
알림이 전송 된 후 설정된 부울 필드를 모델에 추가하십시오 .
그런 다음 옵션 2에도 문제가 있습니다.
- 이벤트 시작 / 종료 날짜 시간이 이동 된 상황을 수동으로 처리하십시오. 를 사용할 때 날짜가 변경되면 (easy, ofc)
celery
를 저장taskID
하고 작업을 취소하고 새 작업을 발행해야합니다. 그러나 셀러리는 미래에 실행되는 작업을 처리 할 때 셀러리에 (디자인 관련) 문제가 있음을 읽었습니다 .github의 Open Issue . 나는 이것이 어떻게 일어나는지 그리고 왜 해결하기가 사소한 것인지를 알고 있습니다.
이제 잠재적으로 내 문제를 해결할 수있는 라이브러리를 발견했습니다.
- celery_longterm_scheduler (그러나 이것은 Differentend Scheduler 클래스로 인해 이전과 같이 셀러리를 사용할 수 없다는 것을 의미합니까? 이것은 또한 가능한 사용법과 관련이 있습니다
django-celery-beat
... 두 프레임 워크 중 하나를 사용하면 작업을 대기열에 넣을 수 있습니까? 조금 더 오래 달렸지만 몇 달이 지나지 않았습니까?) - django-apscheduler 는을 사용합니다
apscheduler
. 그러나 먼 미래에 실행되는 작업을 처리하는 방법에 대한 정보를 찾지 못했습니다.
내가 접근하는 방식에 근본적인 결함이 있습니까? 당신이 가진 모든 입력에 기뻐요.
주의 : 나는 이것이 어떤 견해에 근거한 것 같다는 것을 알고 있지만, 추악하거나 우아하다고 여겨지는 것에 관계없이 내가 놓친 매우 기본적인 것이있을 수 있습니다.