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
งานเป็นระยะ(พูดทุก ๆ ห้านาทีหรือมากกว่านั้น) ซึ่งจะตรวจสอบว่ามีเหตุการณ์ใด ๆ เกิดขึ้นภายในห้านาทีที่ผ่านมาและดำเนินการตามวิธีการของฉันใช้
celery
และกำหนดเวลาonEventElapsed
โดยใช้eta
พารามิเตอร์ที่จะเรียกใช้ในอนาคต (ภายในsave
เมธอดmodel )
เมื่อพิจารณาถึงตัวเลือกที่ 1 ทางออกที่อาจเกิดขึ้นได้ django-celery-beat
ได้ อย่างไรก็ตามดูเหมือนว่าจะแปลกเล็กน้อยในการเรียกใช้งานในช่วงเวลาคงที่สำหรับการส่งการแจ้งเตือน นอกจากนี้ฉันยังพบกับปัญหา (ที่อาจเกิดขึ้น) ที่จะ (อาจ) ทำให้เกิดโซลูชันที่ไม่สง่างาม:
- ตรวจสอบทุกห้านาทีสำหรับเหตุการณ์ที่ผ่านไปในห้านาทีก่อนหน้าหรือไม่ ดูเหมือนจะสั่นคลอนเหตุการณ์บางอย่างอาจพลาดไป ศักยภาพวิธีแก้ปัญหา: เพิ่มเขตข้อมูลบูลีนให้กับรูปแบบที่ตั้งค่าไว้
True
เมื่อส่งการแจ้งเตือนแล้ว
จากนั้นอีกครั้งตัวเลือก 2 ก็มีปัญหาเช่นกัน:
- ดูแลสถานการณ์ด้วยตนเองเมื่อมีการย้ายช่วงเวลาเริ่มต้น / สิ้นสุดกิจกรรม เมื่อใช้
celery
งานเราจะต้องเก็บtaskID
(ง่าย, ofc) และเพิกถอนงานเมื่อวันที่มีการเปลี่ยนแปลงและออกงานใหม่ แต่ผมได้อ่านว่าคื่นฉ่ายมีปัญหา (การออกแบบที่เฉพาะเจาะจง) เมื่อต้องรับมือกับงานที่จะดำเนินการในอนาคต: เปิดออกบน GitHub ฉันรู้ว่าสิ่งนี้เกิดขึ้นได้อย่างไรและทำไมมันถึงเป็นทุกอย่างยกเว้นเรื่องไร้สาระที่จะแก้ไข
ตอนนี้ฉันเจอห้องสมุดที่อาจแก้ปัญหาได้แล้ว:
- celery_longterm_scheduler (แต่นี่หมายความว่าฉันไม่สามารถใช้คื่นฉ่ายอย่างที่ฉันเคยมีมาก่อนเพราะชั้น Scheduler ที่แตกต่างกันนี้ยังเกี่ยวข้องกับการใช้งานที่เป็นไปได้ของ
django-celery-beat
... การใช้หนึ่งในสองเฟรมเวิร์ก ใช้เวลานานขึ้นเล็กน้อย แต่ไม่ถึงเดือนใช่หรือไม่) - Django-apscheduler ,
apscheduler
การใช้งาน อย่างไรก็ตามฉันไม่สามารถหาข้อมูลใด ๆ เกี่ยวกับวิธีจัดการกับงานที่จะดำเนินการในอนาคตอันใกล้
มีข้อบกพร่องพื้นฐานกับวิธีที่ฉันเข้าใกล้นี้หรือไม่? ฉันดีใจที่ได้รับอินพุตจากคุณ
ข้อสังเกต: ฉันรู้ว่านี่น่าจะเป็นความเห็นที่มีอยู่บ้าง แต่อาจมีสิ่งพื้นฐานที่ฉันพลาดไปไม่ว่าจะมีคนคิดว่าน่าเกลียดหรือสง่างามอะไรก็ตาม