如何使用TTL设置Celery,以便从队列中清除旧消息?

时间:2014-01-04 10:21:11

标签: django rabbitmq celery django-celery

我正在使用Celery,Django和RabbitMQ。我正在寻找一种方法来自动清除RabbitMQ中芹菜队列中的旧消息。因此,无论何时默认情况下创建队列,它都应该清除所有早于x秒的消息。

这些是我在settings.py中设置的变量。

CELERY_DEFAULT_EXCHANGE = 'celery'
CELERY_DEFAULT_EXCHANGE_TYPE = 'topic'
CELERY_DEFAULT_ROUTING_KEY = 'celery'
CELERY_DEFAULT_QUEUE = 'celery'
CELERY_EVENT_QUEUE_TTL= 30

我也尝试了这个,但它导致了根本没有消息被发送到RabbitMQ。

CELERY_QUEUES = (                                                                                                                                                                 
Queue('celery', routing_key='celery', queue_arguments={'x-message-ttl': 30}),                                                                                                 
Queue('default', routing_key='default', queue_arguments={'x-message-ttl': 30}),                                                                                               
)

欢迎任何想法。

2 个答案:

答案 0 :(得分:4)

x-message-ttl 毫秒 - NOT SECONDS

你想在你的芹菜配置文件中添加这样的东西:

from kombu import Exchange, Queue

CELERY_QUEUES = [
                     Queue(
                         'celery',
                         Exchange('celery'),
                         routing_key = 'celery',
                         queue_arguments = {
                                                'x-message-ttl': 30000
                                           }
                     )
                ]

答案 1 :(得分:1)

选项CELERY_EVENT_QUEUE_TTL = 30仅适用于事件,而不适用于名称所述的任务。只要有必要,芹菜就会为任务保留信息,这是有道理的。

在我的情况下,我使用RabbitMQ Federation将队列加倍。切换到铲子为我解决了这个问题。