2017-01-18 85 views
5

我遇到了一個奇怪的問題,其中一些任務在發送給經紀人後被丟棄。這發生在10個任務中的大約1個。我已經檢查過,沒有老芹菜工人正在消耗這項工作。發送到rabbitmq經紀商後,芹菜任務丟失

我用數據庫後臺和花來監視丟失的任務,但apply_async之後返回的task_id不存在於數據庫或花中。它的狀態總是等待。

然後我用芹菜信號來找出發生了什麼。我發現,對於丟失的任務,只有before_task_publish和after_task_publish信號被觸發。發佈這個任務沒有任何痕跡。

這些都是我的信號

@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)) 

這是我在日誌

$ 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或其直接丟棄某種原因找到。

+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