1

Celery の 2 つのインスタンスがあります。メールやプッシュなどで特定のイベントをすべてのユーザーに通知できるようにしたいのですが、すべてのユーザーが 1 回だけ通知されるようにしたいと考えています。ユーザーをループして、各ユーザーが一度連絡を受けることを保証する方法の例はありますか?

私が持っている解決策は、ユーザーに通知を受け取ったことを単にマークすることです...しかし、それは非常に非効率的です。また、マークが保存されている間にユーザーが通知を受ける状況が発生する可能性があります。

これに関して、以下を読んでみました。

http://docs.celeryproject.org/en/latest/userguide/routing.html

http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html

[編集]

2 つのインスタンスとは、2 つの EC2 で 1 つのワーカーを意味するので、2 つのワーカーです。

4

1 に答える 1

0

これを読んだことがありますか?タスクが一度に 1 つだけ実行されるようにする

あなたのアプローチは良いと思いますが、それをデータベースに保存することはslow非常に迅速に行うためにキャッシュする必要があります。簡単な設定として、メールを送信する前にメールをキャッシュ (ハッシュ) することができます。キャッシュが既に存在する場合は、電子メールを送信しないでください。

だから、それは次のようなものになります

from hashlib import md5
from django.core.cache import cache
from celery import task

# 1 day because I expect that the whole email task finish within a day
# But the same email may be send out if executed on the next day.
LOCK_TIME = 24 * 60 * 60

@task
def notify_user(email):
    uid = md5(email).hexdigest()

    # This will return False if the uid already exists in the cache
    if cache.add(uid, 'notified', LOCK_TIME):
        send_mail("Subject", "Message", None, [email,])

注意: キャッシュを削除する必要はないと思います。有効期限が切れるまで一度だけ送信するだけです。

于 2013-05-06T17:29:24.663 に答える