7

据我所知,Celery 既是消息的生产者又是消费者。这不是我想要达到的。我希望 Celery 仅充当消费者,根据我发送到我选择的 AMQP 代理的消息来触发某些任务。这可能吗?

或者我需要在我的堆栈中加入胡萝卜来做汤吗?

4

3 回答 3

6

Celery 代理充当消息存储并将它们发布给订阅这些消息的一个或多个工作人员,

所以:celery 将消息推送到代理(rabbitmq、redist、celery 本身通过 django db 等)。这些消息由工作人员按照代理的协议检索,并记住它们(通常它们是持久的,但可能取决于你的经纪人),并被你的工人执行。

任务结果在正在执行的工作任务上可用,您可以配置存储这些结果的位置,您可以使用此方法检索它们。

您可以将带有 celery 参数的任务发布到您的“接收器函数”(您定义的任务,文档中有一些示例,通常您不想在这里传递大的东西(比如查询集),而只是允许您传递的最少信息在执行任务时检索您需要的内容。

一个简单的例子可能是:

你注册一个任务

@task
def add(x,x):
    return x+y

你从另一个模块调用:

from mytasks import add

metadata1 = 1
metadata2 = 2
myasyncresult = add.delay(1,2)
myasyncresult.get() == 3

编辑

在您编辑之后,我看到您可能想从芹菜以外的其他来源构建消息,您可以在此处看到消息格式,它们默认为尊重该格式的腌制对象,因此您将这些消息发布在您的 rabbitmq 代理的正确队列中你去从你的工人那里取回它们是正确的。

于 2013-07-05T10:48:03.193 回答
1

Celery Custom Consumer 将是 3.1v 中发布的一个功能,现在正在开发中,您可以阅读http://docs.celeryproject.org/en/master/userguide/extending.html了解它。

于 2013-09-28T03:36:39.767 回答
1

Celery 使用消息代理架构模式。许多实现/代理传输可以与 Celery 一起使用,包括RabbitMQDjango 数据库

来自维基百科

消息代理是一种用于消息验证、消息转换和消息路由的架构模式。它调解应用程序之间的通信,最大限度地减少应用程序之间应该相互了解以便能够交换消息,有效地实现解耦。

保留结果是可选的,并且需要结果后端。您可以使用不同的代理和结果后端。Celery 入门指南包含更多信息。

您的问题的答案是肯定的,您可以在不添加Carrot的情况下触发传递参数的特定任务。

于 2013-07-05T11:36:12.790 回答