2014-01-12 3 views
1

Итак, я использую сельдерей с RabbitMQ. У меня есть RESTful API, который регистрирует пользователя. Я использую удаленный работник Сельдерей, чтобы отправить регистрационное письмо асинхронно, чтобы мой API мог быстро реагировать.Сельдерей Почему задача остается в очереди

from .tasks import send_registration_email 

def register_user(user_data): 
    # save user to the database etc 

    send_registration_email.delay(user.id) 

    return {'status': 'success'} 

Это прекрасно работает. Электронная почта отправляется в неблокируемом асинхронном режиме (и может быть проведена повторная попытка, если это не помогает). Проблема в том, что я смотрю на консоль управления RabbitMQ. Я вижу, что send_registration_email создал случайную очередь. Что-то вроде:

enter image description here

Я могу видеть, что задача была успешно выполнена. Итак, почему случайная очередь остается на RabbitMQ навсегда? Это полезная нагрузка задача:

{"status": "SUCCESS", "traceback": null, "result": true, "task_id": "aad10877-3508-4179-a5fb-99f1bd0b8b2f", "children": []} 

ответ

3

Это нормальное поведение, если вы настроили CELERY_RESULT_BACKEND в настройках. Пожалуйста, проверьте здесь: Celery result backend description

Вы можете отключить бэкэнд для результата или сократить время жизни сообщения.

+0

Да. Я понял это в то же время. Я добавил ignore_result = True для аннотаций задачи. Является ли хорошей практикой игнорировать результаты? У меня много задач, которые не возвращают никаких результатов (множество задач для отправки писем, логов, отчетов и задач обслуживания и т. Д.), Поэтому я проигнорирую их результаты. –

+0

Вы читаете какие-либо результаты в других задачах RabbitMQ? В этом случае удаление RESULT_BACKEND - лучшее решение, я думаю. – Rustem

+0

У меня есть задачи, из которых я читаю результаты, поэтому я не могу просто отключить результирующий сервер. На самом деле моя SOA работает на AMQP. Вместо SOAP мои сервисы говорят друг с другом по RabbitMQ/Celery. –

Смежные вопросы