小编len*_*nin的帖子

安排重复活动的提醒

我正在使用一个允许用户在日历上创建事件(一次性或重复性)的Web应用程序,并且在事件启动前不久,系统将通知其参与者.我在为这种通知设计流程时遇到了麻烦,特别是对于重复发生的事件.

需要考虑的事项:

  1. Web应用程序的体系结构使得有许多相同结构的数据库,每个数据库都有自己的用户和事件集.因此,针对一个数据库的任何查询都需要针对几千个其他人进行.
  2. 定期事件可能已排除日期(类似于RRULE和EXDATE组合).

  3. 用户可以更新事件的时间/重复规则.

  4. 该应用程序是用Python编写的,并且已经使用带有Redis代理的Celery 3.1.解决方案使用此设置会很好,但任何事情都可以.根据我的发现,目前很难用Celery动态添加周期性任务.

我正在尝试的解决方案:

  • 定期任务每天运行一次,扫描每个数据库并添加任务以在适当的时间为每天发生重复的事件发出通知.

  • 如上生成的每个任务都将其ID临时保存在Redis中.如果用户在安排通知任务后更改当天的事件时间,则该任务将被撤销并替换为新任务.

上述解决方案的示例代码:

  • tasks.py,所有要运行的任务:

    from celery.task import task as celery_task
    from celery.result import AsyncResult
    from datetime import datetime
    
    # ...
    
    @celery_task
    def create_notify_task():
        for account in system.query(Account):
            db_session = account.get_session()    # get sql alchemy session
            for event in db_session.query(Event):
                schedule_notify_event(account, partial_event)
    
    
    @celery_task(name='notify_event_users')
    def notify_event_users(account_id, event_id):
        # do notification for every event participant
        pass
    
    def schedule_notify_event(account, event):
        partial_event = event.get_partial_on(datetime.today())
        if partial_event:
            result = notify_event_users.apply_async(
                    args = (account.id, event.id),
                    eta = …
    Run Code Online (Sandbox Code Playgroud)

python scheduled-tasks celery recurring-events

6
推荐指数
1
解决办法
1451
查看次数