2017-07-11 120 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