【问题标题】:RabbitMQ or Redis exploding Celery queues with Django 2.0RabbitMQ 或 Redis 使用 Django 2.0 爆炸 Celery 队列
【发布时间】:2018-03-19 13:25:18
【问题描述】:

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

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

    • amqp==2.2.2
    • django==1.11.6
    • celery==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
    • celery==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 解决此问题,我将无法做到这一点。我的开发环境是为了确保在升级生产服务器之前一切正常。

问题

  1. 在 Django 2 中发生了什么变化,使系统在 Django 1.11 中稳定,在队列大小爆炸时不稳定,在 RabbitMQ 和 Redis 中具有相同的效果?

  2. 如果有任务没有被消费,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 任务的 celery 队列。似乎 TTL 设置为“-1”但是我不知道如何从 django 设置它。

几个小时后,我有超过 22 万个任务等待处理和增长。

我使用以下设置:在文件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
    },
}

工作人员日志示例

一些想法:“过期”和“时间限制”设置设置为“无”是否正常(见上图)。

【问题讨论】:

  • 作业真的被执行了吗?
  • @DanielRoseman,我已经进行了广泛的检查,是的,似乎任务已被消耗。我之前的说法是错误的。如果有帮助的话,我已经用工作人员的日志编辑了我的帖子。

标签: python django redis rabbitmq celery


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 2012-03-30
    • 2011-05-08
    • 2015-11-14
    • 1970-01-01
    • 2014-06-13
    相关资源
    最近更新 更多