2017-01-18 2 views
5

중개인에게 보낸 후 일부 작업이 중단되는 이상한 문제가 있습니다. 이 작업은 약 10 개의 작업 중 하나에 대해 발생합니다. 작업을하는 오래된 샐러리 작업자가 없다는 것을 확인했습니다.rabbitmq broker로 보낸 셀러리 작업이 손실되었습니다.

필자는 누락 된 작업을 모니터링하기 위해 데이터베이스 백엔드 및 꽃을 사용했지만 apply_async 이후에 반환 된 task_id는 데이터베이스 또는 꽃에 없습니다. 상태는 항상 보류 중으로 나타납니다.

그런 다음 셀러리 신호를 사용하여 무슨 일이 일어나는지 확인합니다. 필자는 누락 된 작업에 대해서만 before_task_publish 및 after_task_publish 신호가 실행됨을 확인했습니다. 이 작업에 대한 흔적이 없다고 게시하십시오.

이 내가 로그

$ cat gunicorn-access.log | grep -i 103de274-00dc-4765-844f-d319e9e199c2 
    BEFORE TASK SENT id: '103de274-00dc-4765-844f-d319e9e199c2' 
    AFTER TASK SENT id: '103de274-00dc-4765-844f-d319e9e199c2' 

내가 작업이 rabbitmq 무시하거나 조용히 어떤 이유로 떨어 있는지 모르겠습니다에서 찾을 것입니다 내 신호

@before_task_publish.connect 
def before_task_publish_handler(sender=None, headers=None, body=None, **kwargs): 
# information about task are located in headers for task messages 
# using the task protocol version 2. 
    logger.info("BEFORE TASK SENT id:"+body['id']) 



@after_task_publish.connect 
def after_task_publish_handler(sender=None, headers=None, body=None, exchange=None, routing_key=None, **kwargs): 
# information about task are located in headers for task messages 
# using the task protocol version 2. 
    logger.info("AFTER TASK SENT id:"+body['id']) 


@task_prerun.connect 
def task_prerun_handler(sender=None, task_id=None, task=None, **kwargs): 
    logger.info("TASK PRERUN with TASK_ID:"+str(task_id)) 

있습니다.

+0

이유를 찾았습니까? 내 문제를 해결하지 못하는 – melih

답변

2

때때로 셀러리는 실행되기 전에 작업을 잃습니다. 잃어 버리지 않으려면 사용 설정을 task_acks_late (이전 버전에서는 CELERY_ACKS_LATE)으로 설정해야합니다. 당신의 셀러리 설정에서

task_acks_late = True 

이 태스크 메시지 after the task has been executed를 인정됩니다 있는지 확인합니다 설정합니다.

+0

. tcpdump는 amqp 패킷이 rabbitmq 서버로 전송되고 있지만 다른 끝에 수신 된 패킷이 없음을 보여줍니다. 클라이언트와 서버가 다른 Azure 계정에 있습니다. Azure의 tcp 연결 시간 제한 구성에 영향을 미칠 수 있지만 keepalive 또는 heartbeat를 사용하면 해결되지 않았습니다. – melih

관련 문제