RabbitMQ或Redis使用Django 2.0爆炸Celery队列

时间:2018-03-19 13:25:18

标签: python django redis rabbitmq celery

我遇到了芹菜和Django 2的问题。我有两个运行环境:

  • 制作:requirements.txt =>没问题

    • AMQP == 2.2.2
    • 的django == 1.11.6
    • 芹菜== 4.1.0
    • Django的芹菜拍== 1.0.1
    • Django的芹菜监视器== 1.1.2
    • 海带== 4.1.0
    • redis的== 2.10.6
  • 开发:requirements.txt =>问题发布

    • AMQP == 2.2.2
    • 的django == 2.0.3
    • 芹菜== 4.1.0
    • Django的芹菜拍== 1.1.1
    • Django的芹菜监视器== 1.1.2
    • 海带== 4.1.0
    • redis的== 2.10.6

应尽快将生产环境迁移到Django 2.0。 但是,如果不解决Celery的这个问题我就无法做到。我的开发环境是为了确保在升级生产服务器之前一切正常。

问题

  1. 使用Django 2改变了一个系统,使用Django 1.11稳定,不稳定,队列大小爆炸,在RabbitMQ和Redis中效果相同?

  2. 如果没有消耗任何任务,Redis / RabbitMQ怎么会自动删除它?

  3. Celery Worker按照以下方式启动

    两个环境都使用完全相同的命令。

    celery beat -A application --loglevel=info --detach 
    celery events -A application --loglevel=info --camera=django_celery_monitor.camera.Camera --frequency=2.0 --detach
    celery worker -A application -l info --events
    

    应用程序设置

    由于我将开发环境迁移到Django 2,我的RabbitMQ队列或Redis队列的大小逐渐爆炸,我的数据库实例继续扩展。似乎任务不再从队列中删除。

    我必须手动清理芹菜队列,其中包含几天后的250k任务。似乎TTL被设置为" -1"但我无法弄清楚如何从django设置它。

    几个小时后,我有超过220k的任务等待处理和增长。 image

    我使用以下设置:文件settings.py

    中提供

    警告:使用的名称可能不是芹菜的正确名称,重新映射一直是使用文件celery.py正确分配值

    # Celery Configuration
    broker_url = "borker_url" # Redis or RabbitMQ, it doesn't change anything.    
    broker_use_ssl=True
    
    accept_content = ['application/json']
    
    worker_concurrency = 3
    
    result_serializer = 'json'
    result_expires=7*24*30*30
    
    task_serializer = 'json'
    task_acks_late=True # Acknoledge pool when task is over
    task_reject_on_worker_lost=True
    task_time_limit=90
    task_soft_time_limit=60
    task_always_eager = False
    task_queues=[
        Queue(
            'celery',
            Exchange('celery'),
            routing_key = 'celery',
            queue_arguments = {
                'x-message-ttl': 60 * 1000 # 60 000 ms = 60 secs.
            }
        )
    ]
    
    event_queue_expires=60
    event_queue_ttl=5
    
    beat_scheduler = 'django_celery_beat.schedulers:DatabaseScheduler'
    beat_max_loop_interval=10
    beat_sync_every=1
    
    monitors_expire_success  = timedelta(hours=1)
    monitors_expire_error  = timedelta(days=3)
    monitors_expire_pending = timedelta(days=5)
    
    beat_schedule = {
        'refresh_all_rss_subscribers_count': {
            'task': 'feedcrunch.tasks.refresh_all_rss_subscribers_count',
            'schedule': crontab(hour=0, minute=5), # Everyday at midnight + 5 mins
            'options': {'expires': 20 * 60} # 20 minutes
        },
        'clean_unnecessary_rss_visits': {
            'task': 'feedcrunch.tasks.clean_unnecessary_rss_visits',
            'schedule': crontab(hour=0, minute=20), # Everyday at midnight + 20 mins
            'options': {'expires': 20 * 60} # 20 minutes
        },
        'celery.backend_cleanup': {
            'task': 'celery.backend_cleanup',
            'schedule': crontab(minute='30'), # Every hours when minutes = 30 mins
            'options': {'expires': 50 * 60} # 50 minutes
        },
        'refresh_all_rss_feeds': {
            'task': 'feedcrunch.tasks.refresh_all_rss_feeds',
            'schedule': crontab(minute='40'), # Every hours when minutes = 40 mins
            'options': {'expires': 30 * 60} # 30 minutes
        },
    }
    

    工作人员记录示例

    Worker LOgs

    一些想法:"到期"是否正常?和" timelimit"设置设置为无(参见上图)。

1 个答案:

答案 0 :(得分:1)

我想我找到了一个临时解决方案,看来芹菜库有一些漏洞。我们必须等待4.2.0版本。

我建议您查看:https://github.com/celery/celery/issues/#4041

作为临时错误修复,我建议使用以下提交:https://github.com/celery/celery/commit/be55de6,它似乎解决了问题:

git+https://github.com/celery/celery.git@be55de6#egg=celery