2

私は今日、EC2 インスタンスに独自の RabbitMQ をインストールする代替アプローチとして、Amazon SQS を検討していました。

ここで説明されているように、ドキュメントに従いました

段落内で次のように述べています。

SQS はまだイベントをサポートしていないため、セロリ イベント、セロリモン、または Django 管理モニターでは使用できません。

eventsここで何を意味するのか少し混乱しています。sendEmail.delay(event)たとえば、以下のシナリオでは、非同期で呼び出す定期的なタスクが毎分あります。

例えば

@celery.task(name='tasks.check_for_events')
@periodic_task(run_every=datetime.timedelta(minutes=1))  
def check_for_events():        
    now = datetime.datetime.utcnow().replace(tzinfo=utc,second=00, microsecond=00)
    events = Event.objects.filter(reminder_date_time__range=(now - datetime.timedelta(minutes=5), now))
    for event in events:        
        sendEmail.delay(event)

@celery.task(name='tasks.sendEmail')
def sendEmail(event):
    event.sendMail()

Amazon SQS で実行すると、次のエラー メッセージが表示されます。

tasks.check_for_events[7623fb2e-725d-4bb1-b09e-4eee24280dc6] 発生した例外: TypeError(' is not JSON serializable',)

ドキュメントで指摘されているのはSQSの制限ですか、それとも根本的に間違っていますか? アドバイス、どうもありがとう

4

2 に答える 2

2

私は解決策を見つけたかもしれません。イベント内の sendMail() 関数をメイン タスクにリファクタリングするだけなので、オブジェクトを json に解析する必要はありません。

@celery.task(name='tasks.check_for_events')
@periodic_task(run_every=datetime.timedelta(minutes=1))  
def check_for_events():    
    now = datetime.datetime.utcnow().replace(tzinfo=utc,second=00, microsecond=00)
    events = list(Event.objects.filter(reminder_date_time__range=(now - datetime.timedelta(minutes=5), now)))
    for event in events:        
        subject = 'Event Reminder'
        link = None
        message = ... 
        sendEmail.delay(subject, message, event.user.email)


@celery.task(name='tasks.sendEmail')
def sendEmail(subject, message, email):
    send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [email])

これは、Rabbitmq と Amazon SQS の両方で機能します

于 2013-01-26T11:39:28.523 に答える
1

この投稿に戻ってきた人にとって、これは、セロリ ランタイム構成で定義されたシリアライザーが、セロリ タスクに渡されたオブジェクトを処理できない場合に発生します。

例: 構成で JSON が必要な形式であると指定されていて、いくつかのモデル オブジェクトが提供されている場合、上記の例外が発生する可能性があります。

(Q): これらのパラメーターを明示的に定義する必要がありますか?

于 2015-07-21T11:37:51.510 に答える