【问题标题】:Can Celery routing be used to for a specific host?芹菜路由可以用于特定主机吗?
【发布时间】:2013-05-24 15:19:00
【问题描述】:

Celery 具有比 saltstack 更好的任务语言,但是它似乎缺少特定于机器的路由。是否可以将 Celery 任务路由到特定机器?

编辑:假设有数百或数千台机器,它们是动态配置(启动/停止)的。所以没办法提前知道机器的名字

【问题讨论】:

标签: routing celery


【解决方案1】:

是的,只需使用默认的自动路由就可以了。如果您希望将 1 个任务植根到一台特定的机器,只需在任务装饰器中添加一个唯一的队列名称,如下所示:

# tasks.py
@task(queue='my_unique_queue')
def web_site_status(url):
    return requests.get(url).status_code

然后使用远程框,只需包含启动 celeryd/workers 时要消耗的队列名称。

$ python manage.py celeryd -l info -Q my_unique_queue

所有远程盒子都可以“使用”一个或多个队列,因此只需使用唯一队列命名单个任务,您就可以将任务分配给所有、一组或单个远程盒子。

如果您需要更多控制,还可以查看@“手动路由”文档:

http://docs.celeryproject.org/en/latest/userguide/routing.html#manual-routing

【讨论】:

  • Q 名称是否可以作为任务参数来调整以适应动态机器配置?此外,如果一台机器被终止,随着越来越多未使用的队列堆积起来,这是否会导致代理中的内存泄漏?
  • 我在上面发布的示例将队列名称作为任务装饰器的参数。对于动态节点配置,有大量的交换和路由参数。但是默认的自动路由非常擅长优雅地拾取新节点并在网络问题后重新启动等。无法评论rabbitmq或redis的内存泄漏,我总是有多个节点消耗每个队列。
  • 我在哪里可以找到您提到的路由参数的代码示例?
  • 查看其他 SO 答案,正确的做法是使用一个交换与多个队列,并 apply_async
猜你喜欢
  • 1970-01-01
  • 2014-11-06
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 2023-03-22
  • 2022-01-27
  • 2013-11-10
相关资源
最近更新 更多