【问题标题】:celery worker not publishing message to the rabbitmq?芹菜工人没有向rabbitmq发布消息?
【发布时间】:2015-10-19 03:02:18
【问题描述】:

我有一个设置,其中 celery_result_backend 已配置为“amqp”。我可以在日志中看到我的任务被工作人员执行。但 它正在使用任务 ID 创建队列,但其状态已过期。我没有得到结果(result = AsyncResult(taskid); result.get() 挂起)。我尝试了所有支持的支持: 1)Mysql:它没有将数据放入芹菜创建的表中 2)Redis:它没有把数据放到数据库中

我有两个centos系统。 1)我正在调用延迟方法将任务发送到正确的rabbitmq。并且工作人员正在监听队列,从那里它将选择任务和进程(我可以看到队列中的任务并被机器2中的工作人员执行但结果没有被放入后端。 ).这里我在做 result.get() 它挂了。

2)工作人员正在其上运行以执行任务。它执行任务但我认为无法放置结果

设置:

RABBITMQ_BROKER_HOST = '10.213.166.133'
RABBITMQ_BROKER_PORT = dqms_settings.RABBITMQ_BROKER_PORT
RABBITMQ_BROKER_VHOST = dqms_settings.RABBITMQ_BROKER_VHOST
RABBITMQ_BROKER_USERNAME = dqms_settings.RABBITMQ_BROKER_USERNAME
RABBITMQ_BROKER_PASSWORD = dqms_settings.RABBITMQ_BROKER_PASSWORD

BROKER_URL = 'amqp://%s:%s@%s:%s/%s' % (RABBITMQ_BROKER_USERNAME,
                                        RABBITMQ_BROKER_PASSWORD,
                                        RABBITMQ_BROKER_HOST,
                                        RABBITMQ_BROKER_PORT,
                                        RABBITMQ_BROKER_VHOST)

#CELERY_TASK_RESULT_EXPIRES = 18000
#CELERY_IGNORE_RESULT = True

CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
#CELERY_RESULT_BACKEND = 'db+mysql://svcacct-dqms:s3cretP@ssw0rd@10.213.166.202:3306/dqms'
#CELERY_RESULT_BACKEND = 'amqp'
#CELERY_AMQP_TASK_RESULT_EXPIRES = 1000 
#CELERY_RESULT_SERIALIZER = 'json'




CELERY_TIMEZONE = TIME_ZONE
CELERYD_PREFETCH_MULTIPLIER = dqms_settings.CELERYD_PREFETCH_MULTIPLIER

CELERY_DEFAULT_QUEUE = dqms_settings.CELERY_DEFAULT_QUEUE
CELERY_DEFAULT_EXCHANGE_TYPE = dqms_settings.CELERY_DEFAULT_EXCHANGE_TYPE
CELERY_DEFAULT_ROUTING_KEY = dqms_settings.CELERY_DEFAULT_ROUTING_KEY

CELERY_QUEUES = dqms_settings.CELERY_QUEUES
CELERY_ROUTES = dqms_settings.CELERY_ROUTES
CELERYD_HIJACK_ROOT_LOGGER = dqms_settings.CELERYD_HIJACK_ROOT_LOGGER
CELERY_ACKS_LATE = dqms_settings.CELERY_ACKS_LATE

CELERY_RESULT_BACKEND = 'redis://:s3cretP@ssw0rd@10.213.166.204:6379/5' #'djcelery.backends.database.DatabaseBackend'
#CELERY_REDIS_MAX_CONNECTIONS = 6
#CELERY_ALWAYS_EAGER = False

有人可以帮忙解释为什么它没有将结果放入队列中吗?

【问题讨论】:

  • "redis://:s3cretP@ssw0rd@10.213.166.204"...我会从不带“@”(或转义)的密码开始
  • 转义会出错...我的密码现在是“s3cretP@ssw0rd”@localhost/db。我在这里做错了吗
  • 带有“@”的密码通常是个坏主意。当 URL 被解释时,@ 之后的任何内容都将成为目标软管,因此在您的情况下,主机现在变为“ssw0rd@10.213.166.202”
  • 这可能是 redis 和 mysql 的问题,但对于 celery_result_backend='amqp' 将过期消息放入队列?为什么会出现这种行为。

标签: rabbitmq celery


【解决方案1】:

这是一个现在很普遍的问题。 将 CELERY_ALWAYS_EAGER 设置为 TRUE 即可完成工作 但是,这不是生产场景中的最佳解决方案。

【讨论】:

    猜你喜欢
    • 2019-04-07
    • 2018-05-04
    • 1970-01-01
    • 2022-01-08
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多