Celery,RabbitMQ,Redis:芹菜消息进入交换,但不是队列?

时间:2016-07-28 22:50:15

标签: python redis rabbitmq celery

我使用的是Python 2.7(sigh),celery == 3.1.19,librabbitmq == 1.6.1,rabbitmq-server-3.5.6-1.noarch,redis 2.8.24(来自redis- cli info)。

我试图从芹菜生产商向芹菜消费者发送消息,并在生产者处获得结果。有1个生产者和1个消费者,但其中有2个rabbitmq(作为经纪人)和1个redis(结果)。

我面临的问题是:

  1. 在消费者中,我通过async_result =获得AsyncResult ZipUp.delay(unique_directory),但async_result.ready()从不 返回True(至少9秒,它不会) - 即使是a 消费者任务,只返回一个字符串。
  2. 我可以在rabbitmq管理网页界面看到我的消息 被rabbitmq交换所收到,但它并没有出现 相应的rabbitmq队列。此外,由。发送的日志消息 ZipUp任务的一开始似乎没有得到 记录。
  3. 如果我不尝试从AsyncResult获取结果,那么事情就会奏效!但我有点希望得到电话的结果 - 这很有用:)。

    以下是配置细节。

    我们按如下方式设置Celery以获得退货:

    CELERY_RESULT_BACKEND = 'redis://%s' % _SHARED_WRITE_CACHE_HOST_INTERNAL
    CELERY_RESULT = Celery('TEST', broker=CELERY_BROKER)
    CELERY_RESULT.conf.update(
        BROKER_HEARTBEAT=60,
        CELERY_RESULT_BACKEND=CELERY_RESULT_BACKEND,
        CELERY_TASK_RESULT_EXPIRES=100,
        CELERY_IGNORE_RESULT=False,
        CELERY_RESULT_PERSISTENT=False,
        CELERY_ACCEPT_CONTENT=['json'],
        CELERY_TASK_SERIALIZER='json',
        CELERY_RESULT_SERIALIZER='json',
        )
    

    我们有另一个Celery配置,它不会期望返回值,并且可以在同一程序中运行。它看起来像:

    CELERY = Celery('TEST', broker=CELERY_BROKER)
    CELERY.conf.update(
       BROKER_HEARTBEAT=60,
       CELERY_RESULT_BACKEND=CELERY_BROKER,
       CELERY_TASK_RESULT_EXPIRES=100,
       CELERY_STORE_ERRORS_EVEN_IF_IGNORED=False,
       CELERY_IGNORE_RESULT=True,
       CELERY_ACCEPT_CONTENT=['json'],
       CELERY_TASK_SERIALIZER='json',
       CELERY_RESULT_SERIALIZER='json',
       )
    

    芹菜生产商的存根看起来像:

    @CELERY_RESULT.task(name='ZipUp', exchange='cognition.workflow.ZipUp_%s' % INTERNAL_VERSION)
    def ZipUp(directory): # pylint: disable=invalid-name
        """ Task stub """
        _unused_directory = directory
        raise NotImplementedError
    

    有人提到在这个存根中使用queue =而不是exchange =会更简单。任何人都可以确认(我用Google搜索但在主题上找不到任何内容)?显然你可以使用queue =除非你想使用扇出或类似的东西,因为并非所有的芹菜后端都有交换的概念。

    无论如何,芹菜消费者开始时:

    @task(queue='cognition.workflow.ZipUp_%s' % INTERNAL_VERSION, name='ZipUp')
    @StatsInstrument('workflow.ZipUp')
    def ZipUp(directory): # pylint: disable=invalid-name
        '''
        Zip all files in directory, password protected, and return the pathname of the new zip archive.
        :param directory Directory to zip
        '''
        try:
            LOGGER.info('zipping up {}'.format(directory))
    

    但是"拉上"无法在任何地方登录。我在芹菜服务器上搜索了该字符串的每个(磁盘支持的)文件,并获得了两个命中:/ usr / bin / zip和我的芹菜任务的代码 - 并且没有日志消息。

    有什么建议吗?

    感谢阅读!

1 个答案:

答案 0 :(得分:0)

似乎在制作人中使用以下任务存根解决了问题:

http://localhost:8080/testdomain/registeruser.do?mylocation=fr

简而言之,它使用queue =而不是exchange =。