安装了 python Celery 的任务 运行 多个节点在哪里?

Where is a task running with multiple nodes having python Celery installed?

如果我在不同的节点上有多个工作人员 运行,那么我怎么知道任务分配给了哪个工作人员? 例如这里有两个工人 10.0.3.101 和 10.0.3.102; Redis 后端在 10.0.3.100 上运行;当任务被发送到任务队列到 Redis 后端时,工作人员获取并执行它。 worker 是 10.0.3.101 还是 10.0.3.102?

另外,如果一个worker说是10.0.3.101 运行一个任务突然停止,我怎么知道失败了?即 Celery 中是否有任何内置的故障转移机制?

谢谢。

我在 Google 上搜索解决了这个问题。 这些知识主要来自 Celery 文档。 我们可以在任务上下文中获取执行任务的 worker 的主机名,或者使用命令获取 worker 机器 IP。任务定义为:

import time
import subprocess
from celery import current_task

@app.task
def report():
    id = current_task.request.id
    ip = subprocess.check_output(
        "ip addr | grep eth0 | grep inet |" +
        " cut -d t -f 2 | cut -d / -f 1", shell=True)
    ip = ip.split('\n')[0].split(' ')[-1]
    hostname = current_task.request.hostname
    current_task.backend.store_result(
        id, result={"ip": ip, "hostname":  hostname}, status="READY")
    time.sleep(100)
    return {
        "ip": ip,
        "hostname": hostname
    }

如果在机器上或容器中启动 worker:

celery worker -A node.tasks --hostname="visible_hostname_in_request.hostname"

然后我们可以使用以下几行来获取工作人员的 IP 或主机名:

# python
>>> from node.tasks import report
>>> r = report.delay()
>>> r.result

据我所知,Celery没有内置故障转移机制,需要自己实现;我们也可以使用第三方库,比如 dispy ...