【问题标题】:Triggering Celery Tasks from c++ with Redis使用 Redis 从 C++ 触发 Celery 任务
【发布时间】:2015-12-18 08:34:41
【问题描述】:

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

由于在某些情况下会很方便,所以我今天想知道是否可以从C++ 中触发Celery 任务。

由于C++ 有一个Redis 客户端可用,我很确定这是可能的,如果将正确的消息发送到Redis,但是,我无法在任何地方找到有关此的任何信息.

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

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

感谢任何帮助。 (另外,如果你有理由说明这不起作用。)

谢谢。

【问题讨论】:

  • “我无法在任何地方找到有关此的任何信息”,您所说的“这个”是什么意思,究竟要向 Redis 发送哪些消息?检查 Django 应用程序的源代码应该清楚这一点(我想 Django 应用程序将一些东西发送到一个队列,一个 C++ 程序监视该队列并处理它,而 Django 应用程序接收结果)。
  • 这里的'this'是指消息的格式或有关使用消息的任何信息。当然,这些信息应该在 celery 源中可用,但在我深入研究之前,我希望在某个我根本无法找到的地方有一个文档。
  • Tim,Redis 使用的底层通信协议记录在 redis.io/topics/protocol,它并不复杂(基本上是 TCP/IP 上的文本)。许多编程语言的客户端多种多样,它们会为你讨论这个协议(redis.io/clients,但你可能已经知道了)。因此,如果您想从 C++ 程序中命令 Celery,您可能必须从该 C++ 程序中将一些消息输入到 Redis 实例中。问题是:究竟是什么信息。如果您知道,您可以使用 TCP/IP 或 Redis 客户端库来输入它。
  • 是的,这是我的问题。我知道这些信息可以在芹菜源的某个地方获得,但我希望它也记录在其他地方。显然情况并非如此,所以我将开始挖掘。
  • 我们从 erlang 触发 celery 任务。消息格式没有完整记录 - 你必须阅读 celery 源代码才能理解格式 - 开始工作并不难

标签: c++ django asynchronous redis celery


【解决方案1】:

我也需要从 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"
        }
    }
}

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

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

如果您的任务有问题,您可以将kwargs: {"key": "value", ...} 添加到您的正文中。

地图上方的主体触发了一个名为process_fim_event 的任务。任务定义如下:

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

【讨论】:

    【解决方案2】:

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

    因此,我们的想法是,您的 c++ 应用程序将对花 API 发出 HTTP 请求,然后将任务插入到您的 Redis 队列中。

    【讨论】:

    • 好的,这将是一个解决方案。但是,我更喜欢直接使用 c++,因为为此运行另一个服务似乎浪费了不必要的资源。
    • 找出需要什么样的消息(可能通过检查显然已经发送它们的 Django 应用程序的源),并使用 Redis 的 C++ 客户端库来发送这样的消息。然后,您将不需要从 C++ 程序执行 curl 的中间步骤(或使用 curllib 向您的 Redis 实例发出 HTTP 请求)。
    猜你喜欢
    • 2019-08-03
    • 2018-08-06
    • 2018-05-03
    • 2017-10-29
    • 1970-01-01
    • 2013-06-15
    • 2017-02-13
    • 2012-01-22
    • 2016-10-30
    相关资源
    最近更新 更多