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

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

>生产:requirements.txt =>没有任何问题

> amqp == 2.2.2
> django == 1.11.6
>芹菜== 4.1.0
> django-celery-beat == 1.0.1
> django-celery-monitor == 1.1.2
> kombu == 4.1.0
> redis == 2.10.6

>发展:requirements.txt =>问题在场

> amqp == 2.2.2
> django == 2.0.3
>芹菜== 4.1.0
> django-celery-beat == 1.1.1
> django-celery-monitor == 1.1.2
> kombu == 4.1.0
> redis == 2.10.6

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

这个问题

>使用Django 2改变了一个系统,使用Django 1.11稳定,不稳定,队列大小爆炸,在RabbitMQ和Redis中效果相同?
>如果没有消耗任何任务,Redis / RabbitMQ怎么会自动删除它?

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的任务等待处理和增长.

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

警告:对于celery,使用的名称可能不正确,重映射已经使用文件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
    },
}

工作者记录示例

《python – RabbitMQ或Redis使用Django 2.0爆炸Celery队列》

一些想法:“expires”和“timelimit”设置设置为None是否正常(见上图).

最佳答案 我想我找到了一个临时解决方案,似乎芹菜库有一些漏洞.我们必须等待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
点赞