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