2

次のような注文で時間ベースの条件が満たされたときにメールを送信する顧客育成アプリケーションを構築しています。

  • 50% OF Order time_to_ship elapsed
  • 10 DAYS AFTER Order ship_date
  • 5 DAYS AFTER NewsletterSubscriber signup_date

これらのイベントを最適に起動して処理する方法を決定しようとしています。私はこの問題を扱った経験がないので、どんな意見でも歓迎します。

現在のアイデア: 各ハンドラーの一致をポーリングし、各ハンドラーと一致するコンボが追加のテーブルを介して 1 回だけ起動するようにします。この場合、他の場所でリッスンできるイベントを発生させることはなく、各ハンドラーが独自のクエリを実行します。3 つのハンドラー5 days after ...が 3 つのクエリを起動します。

#  build table that stores which handlers have fired for a given object 
class HandlerFired(models.Model):
    ctype = models.ForeignKey(ContentType, related_name="handlerfired_ctype")
    id = models.IntegerField()
    handler = models.ForeignKey(Handler)

class Handler(models.Model):
    ctype = models.ForeignKey(ContentType)
    condition = ...

#  cron job every day 
for handler in Handler.objects.filter(is_active=True):
    objects = handler.run_query().exclude(
         handlerfired=handler, handlerfired_ctype=handler.ctype)
    handler.handle(objects) # do whatever it's supposed to do with given objects.
    # handle() would also make sure the `HandlerFired` table is populated with a record.

このアイデアは、プロジェクトを開始したときに想像していたよりも少し多くの悲しみ/オプションを与えてくれました. 時間主導のイベントを持つことは、かなり一般的な問題のように思えます。

または、ハンドラーではなくイベントの毎日の cron ジョブを実行することもできますが、発生したすべてのイベントを追跡して、2 を発生させないようにするか、1 つがスキップされないようにする必要があると思います (たとえば、20% のイベントがスキップされたため、ダウンタイム)。これにより、発生したハンドラーを記録するよりも数千のレコードが保存されますが、実際のイベント エミッターのように感じられます。

4

2 に答える 2

5

Django async は非同期実行キューです。将来のイベントをスケジュールして、その時点で条件が有効かどうかを確認できます。たとえば、注文が出荷されたときに 10 日後に発生するイベントをスケジュールし、それが実行されると、電子メールを送信する前に他の条件を確認できます。

http://pypi.python.org/pypi/django-async/

Django async には run once の動作が組み込まれており、何らかの理由でキューが停止した場合、再起動時に過去のジョブに追いつきます。一時的なエラー (SMTP サーバーのダウンなど) は自動的に再試行されます。

于 2012-07-12T03:23:06.523 に答える
0

必要な処理を実行する django 管理コマンドを作成し、それを定期的に実行する cronjob を割り当てます。

次に、条件が満たされた/処理されたかどうか、および/またはどのレコードがイベントをトリガーしたかを追跡するモデルが必要になる場合があります。

于 2012-07-12T03:19:44.923 に答える