使用 Redis 从 C++ 触发 Celery 任务

Triggering Celery Tasks from c++ with Redis

我们有一个设置,其中我们有一个用 Django 编写的 Web 前端和一个用 C++ 编写的后端为我们解析数据。 前端将 CeleryRedis 结合用于异步任务。

因为在某些情况下会很方便,所以我今天想知道是否可以从 C++.

中触发 Celery 任务

因为有一个 Redis 客户端可用于 C++,我很确定这是可能的,如果正确的消息被发送到 Redis,但是,我不是能够在任何地方找到关于此的任何信息。

我的下一步是尝试从 Celery 源代码中挖掘所需的信息,但在此之前:

有没有人有关于这个主题的任何信息可以帮助我或让我开始,或者甚至有人以前做过这个?

感谢任何帮助。 (另外,如果你知道这不起作用的原因。)

谢谢。

据我所知,最简单的方法是使用 flower,一个 HTTP Celery API。使用 flower,您可以使用任何可以发出 HTTP 请求的东西来创建任务。 Github 自述文件中的一个示例: $ curl -X POST -d '{"args":[1,2]}' http://localhost:5555/api/task/async-apply/tasks.add

所以,我们的想法是,您的 C++ 应用程序会对花 api 发出 HTTP 请求,然后将任务插入到您的 Redis 队列中。

我也有类似的需要从 logstash 触发 celery 任务。基本上,我必须创建一条看起来像这样的消息:

{
    "body": "base_64_encoded_string (see below)",
    "content-type": "application/json",
    "properties": {
        "body_encoding": "base64", 
        "correlation_id":"f009c9e0-0ca6-42a6-a046-3d0e53e06060",  
        "reply_to":"e1eb91f0-6780-4c34-b633-7ef9a46baf5e",
        "delivery_mode":2, 
        "delivery_tag": "7788b924-a7fe-4c9a-839e-1c7ca602dbba",
        "delivery_info": {
            "priority":0,
            "routing_key":"default",
            "exchange":"default"
        }
    }
}

在这种情况下,解码后的 body 转换为:

{
    "args": ["meta_val","doc_value"],
    "task":"goldstone.compliance.tasks.process_fim_event",
    "id":"23deb69e-49c1-4a61-8639-d4627d0fc591"
}

如果您的任务有 kwargs,您可以在 body 中添加一个 kwargs: {"key": "value", ...}

地图上方的 body 触发了名为 process_fim_event 的任务。任务定义如下:

@task()
def process_fim_event(meta, doc):
    ...