芹菜+;HaProxy+;RabbitMQ丢失任务消息

芹菜+;HaProxy+;RabbitMQ丢失任务消息,rabbitmq,celery,django-celery,Rabbitmq,Celery,Django Celery,可能不是询问的最佳地点(可能是服务器故障),但我会在这里尝试: 我让django芹菜通过HaProxy将任务发送到RabbitMQ集群,我们时不时地丢失消息(未执行的任务) 观察到的 我们轮流观察工人,监控队列大小,我们注意到我们开始了100份工作,但只有99份出现在队列中 当其他进程将RabbitMQ用于其他作业时,似乎会发生这种情况 尝试过 我尝试用具有许多连接的虚拟消息淹没RabbitMQ,并尝试将一些适当的任务放入队列,但我无法不断复制该问题 只是想知道以前是否有人经历过这种情况

可能不是询问的最佳地点(可能是服务器故障),但我会在这里尝试:

我让django芹菜通过HaProxy将任务发送到RabbitMQ集群,我们时不时地丢失消息(未执行的任务)

观察到的

  • 我们轮流观察工人,监控队列大小,我们注意到我们开始了100份工作,但只有99份出现在队列中
  • 当其他进程将RabbitMQ用于其他作业时,似乎会发生这种情况
尝试过

  • 我尝试用具有许多连接的虚拟消息淹没RabbitMQ,并尝试将一些适当的任务放入队列,但我无法不断复制该问题
只是想知道以前是否有人经历过这种情况

更新:

因此,我深入到代码中,最终无意中发现了芹菜/app/amqp.py,我通过向一个不存在的exchange添加额外的发布方法进行调试,请参见以下内容:

    log.warning(111111111)
    self.publish(
        body,
        exchange=exchange, routing_key=routing_key,
        serializer=serializer or self.serializer,
        compression=compression or self.compression,
        headers=headers,
        retry=retry, retry_policy=_rp,
        reply_to=reply_to,
        correlation_id=task_id,
        delivery_mode=delivery_mode, declare=declare,
        **kwargs
    )
    log.warning(222222222)

    self.publish(
        body,
        exchange='celery2', routing_key='celery1',
        serializer=serializer or self.serializer,
        compression=compression or self.compression,
        headers=headers,
        retry=retry, retry_policy=_rp,
        reply_to=reply_to,
        correlation_id=task_id,
        delivery_mode=delivery_mode, declare=declare,
        **kwargs
    )
    log.warning(333333333)

然后尝试从项目代码中触发100个任务,结果只有1条消息被放入芹菜队列,我认为这是由ProducerPool或ConnectionPool引起的

从文档中,芹菜确认延迟表示任务消息将在任务执行后得到确认,而不是在之前,这是默认行为。我的意思是使用RMQ-消费者可以使用确认来确认作业何时完成,或者使用否定确认来拒绝作业并将其推回到工作队列。如果没有这些,如果消费者没有完成作业就失败了,作业可能会被悄悄地丢弃。我一点也不知道芹菜,但确保RMQ消费者使用ACK可以防止失去工作。@ChrisHeald我更新了我的问题,问题是消息没有放入队列。听起来问题可能是HAProxy的问题?您是否尝试过从堆栈中删除HAProxy以查看问题是否仍然存在?尝试直接指向rabbitmq服务器,问题仍然存在。