我有三个芹菜任务,分别在三个不同的服务器上运行。
- tasks.send_push_notification
- tasks.send_sms
- tasks.send_email
我想设置一个工作流程,以便在发送推送通知失败时,我应该尝试发送短信。如果发送短信失败,我应该发送电子邮件。
如果这 3 个任务及其代码库在同一台服务器上,我会按照链式任务的示例进行操作,并执行类似
from celery import chain
from tasks import send_push_notification, send_sms, send_email
import json
# some paylaod
payload = json.dumps({})
res = chain(
send_push_notification.subtask(payload),
send_sms.subtask(payload),
send_email.subtask(payload)
)()
但是任务保存在 3 个不同的服务器上!
我试过了
# 1
from celery import chain
from my_celery_app import app
res = chain(
app.send_task('tasks.send_push_notification', payload),
app.send_task('tasks.send_sms', payload),
app.send_task('tasks.send_email', payload)
)()
# Which fails because I am chaining tasks not subtasks
和
# 2
from celery import chain, subtask
res = chain(
subtask('tasks.send_push_notification', payload),
subtask('tasks.send_sms', payload),
subtask('tasks.send_email', payload)
)()
# fails because I am not adding the tasks on the broker
如何做到这一点?
更新:我可以使用link
而不是chain
来做到这一点。
from celery import subtask
res = app.send_task(
'tasks.send_push_notification', (payload, ),
link=subtask(
'tasks.send_sms', (payload, ),
link=subtask(
'tasks.send_email', (payload, ),
)
)
)
有很多嵌套。而且因为我实际上需要创建一个数据库驱动的工作流,所以以这种方式创建它会很复杂。
为什么不在任务中处理它,
def push_notification_task(payload):
if not send_push_notification(payload):
sms_notification_task.delay(payload)
def sms_notification_task(payload):
if not send_sms_notification(payload):
email_notification_task.delay(payload)
def email_notification_task(payload):
send_email_notification(payload)
此外,chain
将按给定顺序执行所有任务,而您希望下一个任务仅在第一次失败时才运行。