2015-05-19 3 views
3

У нас есть сервер Celery/RabbitMQ на базе Windows, который выполняет длительные задачи python вне процесса для нашего веб-приложения.
Что это значит, например, взять CSV-файл и обработать каждую строку. Для каждой строки он записывает одну или несколько записей в нашей базе данных.RabbitMQ Сообщения в очереди продолжают расти

Кажется, что все в порядке, я вижу, что записи записываются рабочими процессами. Однако, когда я проверяю сервер rabbitMQ с помощью плагина управления (средство управления веб-интерфейсом), я вижу, что сообщения в очереди увеличиваются, а не возвращаются.

Под соединениями я вижу 116 подключений, около 10-15 на виртуальный хост, все «работает», но когда я нажимаю, большинство из них имеют «простоя» в качестве состояния. Я также интересно, почему эти связи все еще открыты, и если есть что-то мне нужно изменить, чтобы сделать их закрыть себя: enter image description here

«Очереди» Under можно увидеть более 6200 предметов с государством «простаивает» , и не уменьшается.

Так конкретно я прошу, если это нормальная статистика, или если я должен беспокоиться о Очереди растут, но не возвращаются вниз и постоянные соединения, которые, кажется, не закрывать ...

Другие, чем довольно краткая помощь внутри инструмента управления, я не могу найти никакой информации о том, что означают эти статистические данные, и если они хорошие или плохие.

Я также хотел бы знать, почему сообщения все еще видны в очередях и почему они не удаляются, поскольку задачи кажутся завершенными.

Любая помощь приветствуется.

+0

Вы отправляете Ack обратно, чтобы подтвердить, что сообщение обработано? Пока соединения могут остаться, я ожидаю, что сообщения в очереди упадут. –

+0

Привет @DavinTryon. Задачи обрабатываются Celery, что позволяет нам просто украсить функцию Python с помощью @@ celery.task, я не знаю, как сельдерей обрабатывает подтверждения внутри. Тем не менее, когда я запускаю rabbitmqctl list_consumers, я получаю потребитель, у которого подтверждение подтверждается логическим значением False. –

+0

@DavinTryon; кажется, что по умолчанию сельдерей должен признать задачу, как только работник ее подбирает: http://celery.readthedocs.org/en/latest/userguide/tasks.html –

ответ

3

Отвечая на мой собственный вопрос;

Сельдерей отправляет ответное сообщение для каждой задачи в вызывающем коде. Это сообщение отправляется обратно через ту же очередь AMPQ. Вот почему задачи работали, но очередь продолжала заполняться. Мы не обращались с этими результатами или даже интересовались ими.

Я добавил ignore_result=True к заданию сельдерея, поэтому задача не отправить сообщения результатов обратно в очередь. Это было основным решением проблемы.

Кроме того, для ускорения сельдерея был добавлен параметр конфигурации CELERY_SEND_EVENTS = False. Если установлено значение ИСТИНА, эта опция имеет события отправки сельдерея для инструментов внешнего мониторинга.

В дополнение к этому CELERY_TASK_RESULT_EXPIRES = 3600 теперь гарантирует, что даже если результаты будут отправлены обратно, они истекут через один час, если не будут получены/подтверждены.

Наконец, для CELERY_RESULT_PERSISTENT установлено значение False, это означает, что сельдерей не сохраняет эти сообщения результатов на диске. Они исчезнут, когда сервер выйдет из строя, что прекрасно в нашем случае, поскольку мы их не используем.

Итак, короче говоря; если вам не нужна обратная связь в приложении о том, когда и когда задачи завершены, используйте задачу ignore_result=True по заданию сельдерея, чтобы сообщения не отправлялись обратно. Если вам нужна эта информация, убедитесь, что вы берете и обрабатываете результаты, чтобы очередь перестала заполняться.

0

Если вам не нужна надежность, вы можете сделать ваши очереди кратковременными.

http://celery.readthedocs.org/en/latest/userguide/optimizing.html#optimizing-transient-queues

CELERY_DEFAULT_DELIVERY_MODE = 'transient' 
+0

Я в порядке с постоянными сообщениями, по сути, Я перенесу это на преходящее время, и я не совсем уверен, как это решит проблему; сообщения кажутся стоящими в очереди, что делает их временными, приведет к тому, что сообщения будут потеряны, когда будет катастрофа. –

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