我正在使用celery的apply_async方法来排队任务。我希望每天运行大约100,000个这样的任务(数量只会增加)。我使用RabbitMQ作为经纪人。几天前我运行了代码,RabbitMQ在几个小时后崩溃了。我注意到apply_async为每个任务创建一个新队列,x-expires设置为1天。我的假设是,当创建了如此多的队列时,RabbitMQ会窒息。如何阻止芹菜为每项任务创建额外的队列?
我还尝试将queue参数提供给apply_async,并为该队列分配了一个x-message-ttl。消息确实进入了这个新的队列,然而它们立即被消耗,并且从未达到我放置的30秒的ttl。这并没有阻止芹菜创造这些额外的队列。
这是我的代码:
views.py
from celery import task, chain
chain(task1.s(a), task2.s(b),)
.apply_async(link_error=error_handler.s(a), queue="async_tasks_queue")
tasks.py
from celery.result import AsyncResult
@shared_task
def error_handler(uuid, a):
#Handle error
@shared_task
def task1(a):
#Do something
return a
@shared_task
def task2(a, b):
#Do something more
celery.py
app = Celery(
'app',
broker=settings.QUEUE_URL,
backend=settings.QUEUE_URL,
)
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
app.amqp.queues.add("async_tasks_queue", queue_arguments={'durable' : True , 'x-message-ttl': 30000})
来自芹菜日志:
[2016-01-05 01:17:24,398:INFO / MainProcess]收到的任务: project.tasks.task1 [615e094c-2ec9-4568-9fe1-82ead2cd303b]
[2016-01-05 01:17:24,834:INFO / MainProcess]收到的任务: project.decorators.wrapper [bf9a0a94-8e71-4ad6-9eaa-359f93446a3f]
当执行这些任务时,RabbitMQ有两个名为“615e094c2ec945689fe182ead2cd303b”和“bf9a0a948e714ad69eaa359f93446a3f”的新队列 我的代码在Django 1.7.7,芹菜3.1.17和RabbitMQ 3.5.3上运行。
欢迎任何其他异步执行任务的建议
答案 0 :(得分:0)
尝试使用不同的后端 - 我推荐Redis。当我们尝试将Rabbitmq用作代理和后端时,我们发现它不适合代理角色。