2017-07-11 16 views
0

私は、数分おきにデータベース内のデータを利用できるイベントのリストを通知するサービスを試しています。次のイベントの2分前に、このデータベースを読んで、そのイベントが開始されようとしていることを知らせるために、加入者にデータを送信する必要があります。この時間は固定されていません。それらは、次のイベントのイベント時刻に依存する。これは、長時間実行される非同期タスクを実行する正しいアプローチですか?

今、私は購読しているすべてのユーザーのためにセロリ労働者を作成しています。私は特定のセロリの労働者が次のイベントまで眠りにつくようにします。その時点でそれが再開され、メッセージが送信されます。

このような何か:

nextEventDelay = events.getTimeToNextEventInSeconds() 

    sleep(nextEventDelay) 

    SendEventNotification() 

しかし、私は知っている、それは良いではありません。一人/ 2人のために働いています。しかし、1000人のユーザーにとって、1000人のワーカーを生み出すなら、それはうまくいかないでしょう。

私のソリューションですか?私は、加入者のためにデータベースを監視する単一のワーカープロセスを作成し、通知が送信されるとデータベースから読み取り、それらに送信することを考えています。 しかし、これは1つのイベントのみを処理します。私は、次のイベントについて通知するためにこれを無限のループに入れておくべきですか?

私はredisによる非同期タスク管理にCeleryを使用しています。 appplicationはPythonフラスコアプリケーションです。あなたがもっと情報を必要とするかどうかを教えてください。ありがとう。

答えて

0

セロリのビートを使用すると、x秒ごとにジョブを実行して、開始から2分以内にイベントがないかどうかを確認できます。あなたはそのタスクからあなたの「思い出させる」仕事を引き起こすことができます。

定期的なセロリの作業のためのドキュメントです。 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 
関連する問題