2013-12-20 4 views
3

Я использую сельдерей 3.0.18 с RabbitMQ 3.0.2. У меня есть задача, отправленная в другое приложение с помощью celery.send_task, и я вижу вызов send_task в своих журналах, я вижу, что пакеты покидают рабочий экземпляр, и я вижу, как пакеты попадают в экземпляр RabbitMQ, когда я вызываю tcpflow -ce -i any port 5672, однако в очередь попадает только первое сообщение. Все они имеют один и тот же ключ маршрутизации, я пытался воссоздать обмен и привязки и даже новый экземпляр RabbitMQ, и ничего не работает. Это работало отлично в течение нескольких месяцев, пока нам не пришлось перестраивать RabbitMQ с нуля после аварии в нашей инфраструктуре AWS. Как ни странно, у меня есть такая же настройка, которая работает с другим приложением, используя тот же брокер и тот же обмен, привязку и очередь, и он отлично работает там. Кроме того, он работает, когда я отправляю сообщения на тот же обмен, используя тот же вызов из сценария управления, который запускается из оболочки в том же экземпляре, но он не работает, когда он отправляется из задачи сельдерея в рабочем процессе.RabbitMQ отбрасывает сообщения после первого

Любые идеи о том, что может быть проблемой?

+1

Вы уверены, что ваша заявка после отправки задачи там - не получила ее как работник сельдерея. Полагаю, это будет похоже на то, что вы описываете – Rustem

+0

Да, я уверен. –

ответ

1

В конце концов я понял, что случилось, но неясно, является ли это ожидаемым поведением, ошибкой сельдерея или ошибкой RabbitMQ.

Что происходит, что помимо наших прикладных задач у меня есть собственный обработчик ведения журнала, используемый для отправки журналов в центральное место с помощью RabbitMQ с использованием celery.send_task. Этот обработчик протоколирования отправляет сообщения в обмен с именем application.logger с ключом маршрутизации, таким как application.logger.info, application.logger.warning и т. Д., И имеет привязки для маршрутизации некоторых уровней ведения журнала в определенные очереди. Этот обмен, привязки и очереди были созданы непосредственно в RabbitMQ и не определены в маршрутах сельдерея.

Когда работник пытается отправить сообщение на этот обмен, и его не существует, сельдерей зарегистрирует ошибку 404 NOT_FOUND. После этого задачи, отправленные на другие обмены с использованием того же соединения, не были доставлены. Они были отправлены рабочим экземпляром, мы увидели, что поступающие пакеты и экран управления RabbitMQ для этого соединения даже показывают данные, поступающие с клиента в kb/s, но сообщения не были доставлены.

Смежные вопросы