Я обнаружил, что celery purge
не работает для моей более сложной конфигурации сельдерея. Я использую несколько именованных очередей для разных целей:
$ sudo rabbitmqctl list_queues -p celery name messages consumers
Listing queues ... # Output sorted, whitespaced for readability
celery 0 2
celery@web01.celery.pidbox 0 1
celery@web02.celery.pidbox 0 1
apns 0 1
apns@web01.celery.pidbox 0 1
analytics 1 1
analytics@web01.celery.pidbox 0 1
bcast.361093f1-de68-46c5-adff-d49ea8f164c0 0 1
bcast.a53632b0-c8b8-46d9-bd59-364afe9998c1 0 1
celeryev.c27b070d-b07e-4e37-9dca-dbb45d03fd54 0 1
celeryev.c66a9bed-84bd-40b0-8fe7-4e4d0c002866 0 1
celeryev.b490f71a-be1a-4cd8-ae17-06a713cc2a99 0 1
celeryev.9d023165-ab4a-42cb-86f8-90294b80bd1e 0 1
Первый столбец - это имя очереди, второй - количество сообщений, ожидающих в очереди, а третий - количество прослушивателей этой очереди. Очереди:
- сельдерей - Очередь для стандартных идемпотентных задач с сельдереем
- apns - очередь задач Apple Push Notification Service, не совсем идемпотентная
- analytics - Очередь для продолжительной ночной аналитики
- *. Pidbox - очередь для рабочих команд, таких как выключение и сброс, по одной на одного работника (2 сельдерея, один работник apns, один аналитик)
- bcast. * - Широковещательные очереди для отправки сообщений всем работникам, прослушивающим очередь (а не только первым, кто ее получил)
- celeryev. * - Очереди событий Celery, для аналитики отчетов о задачах
Задача аналитики - это грубые задачи, которые отлично работали на небольших наборах данных, но теперь на их обработку уходит более 24 часов. Иногда, что-то идет не так, и он застревает в ожидании в базе данных. Его нужно переписать, но до тех пор, пока он не застрянет, я убиваю задачу, очищаю очередь и пытаюсь снова. Я обнаружил «застревание», просматривая количество сообщений для очереди аналитики, которое должно быть 0 (законченная аналитика) или 1 (ожидание завершения аналитики прошлой ночью). 2 или выше - это плохо, и я получаю электронное письмо.
celery purge
предлагает удалить задачи из одной из широковещательных очередей, и я не вижу возможности выбрать другую именованную очередь.
Вот мой процесс:
$ sudo /etc/init.d/celeryd stop # Wait for analytics task to be last one, Ctrl-C
$ ps -ef | grep analytics # Get the PID of the worker, not the root PID reported by celery
$ sudo kill <PID>
$ sudo /etc/init.d/celeryd stop # Confim dead
$ python manage.py celery amqp queue.purge analytics
$ sudo rabbitmqctl list_queues -p celery name messages consumers # Confirm messages is 0
$ sudo /etc/init.d/celeryd start