2014-01-12 2 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를 통해 내 서비스가 서로 이야기합니다. –