2017-07-11 91 views
0

我想为每个数据库中数据可用的事件列表提供通知服务,每隔几分钟使用一些机制进行更新。在下一个活动前2分钟,我需要阅读这个数据库并将数据发送给我的用户,以提醒活动即将开始。这个时间不固定。他们取决于下一个事件的事件时间。这是运行长时间运行的异步任务的正确方法吗?

现在我正在为订阅的每个用户创建一个芹菜工作者。我让特定的芹菜工人去睡觉,直到下一个事件,此时它恢复并发送消息。

事情是这样的:

nextEventDelay = events.getTimeToNextEventInSeconds() 

    sleep(nextEventDelay) 

    SendEventNotification() 

但我知道,这是不好的。对于一个人/两个人来说,它正在工作。但是对于1000名用户来说,如果它产生了1000名工作人员,那就不太好。

那么我的解决方案?我正在考虑创建一个单独的工作进程,该进程将监视订户的数据库,一旦通知发送出去,就会从数据库中读取并发送给他们。 但是,这只需要处理一个事件。我是否应该在无限循环中通知有关下一个事件?

我正在使用Celery进行与redis的异步任务管理。该应用程序是Python烧瓶应用程序。让我知道你是否需要更多信息。谢谢。

回答

0

使用芹菜节拍,您可以每x秒运行一次作业,检查是否有任何事件在开始的两分钟内。然后,您可以从该任务中触发您的“提醒”作业。

这里是定期芹菜任务的文档。 http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html

我建议你远离长时间运行的芹菜任务,因为我没有与他们很好的经验。

这是一些未经测试的伪代码,以帮助您入门。

from celery import Celery 
from celery.schedules import crontab 

app = Celery() 

@app.on_after_configure.connect 
def setup_periodic_tasks(sender, **kwargs): 
    # check for events every 20 seconds 

    sender.add_periodic_task(20.0, trigger_reminders.s(), name='check for upcoming events') 

@app.task 
def trigger_reminders(*args, **kwargs): 
    upcoming_events = get_upcoming_events() 
    for event in upcoming_events: 
     send_notification.delay(event) 

@app.task 
def send_event(*args, **kwargs): 
    #Send the user notification