WSCeleryActivity — быстрые уведомления об активных задачах Celery с помощью WebSocket

Я развиваю внутренний Django-проект, в котором активно используется очередь Celery. Специфика проекта подразумеват, что пользователь закрытой области (администратор) должен быть в курсе, какие задачи в данный момент времени Celery выполняет. Достаточно иметь под рукой только их названия. В интерфейсе предусмотрен блок, который отображает список активных в данный момент задач (уникальные названия без детализации по исполнителям). С использованием лонг-пуллинга данные периодически обновляются. Со временем стали проявляться такие недостатки, как задержка между событием и уведомлением, входящий трафик на сервер. Поскольку поддержка WebSocket в современных браузерах достаточно хорошая, было принято решение реализовать WebSocket-сервер.

Кто работает с Celery, знает, что существует flower. Отличный инструмент для мониторинга и администрирования Celery-кластеров. Он предоставляет API для разных задач, в том числе WebSocket API для отслеживания состояния задач. С flower можно за 5 минут получить монитор активности по задачам Celery, интегрированный в ваш интерфейс. Но особенности таковы, что для определенных состояний задач вы не сможете получить название задачи в JSON-сообщении WebSocket API. Документация по событиям в Celery говорит нам, что только task-sent и task-received содержат имя задачи (flower использует celery.events.state для получения информации о событиях). Конечно, есть веб-интерфейс flower, где можно получить очень подробную информацию, но решаемая мной задача состоит в том, чтобы оперативно получать список активных в данный момент задач (уникальные названия без детализации по исполнителям).

Интересное решение — wscelery — предложил Antonis Kalou, взяв за основу идеи flower. Но wscelery предлагает подписку на события конкретной задачи. То есть мы не можем отслеживать все задачи.

Изучив исходники flower и wscelery, я написал производное решение — WSCeleryActivity. Это Tornado-сервер, который каждую секунду уведомляет всех клиентов WebSocket об активных в данный момент задачах Celery. Необходимую информацию я получаю через celery.app.control (если у вас есть другая идея, как это сделать, напишите мне).

Пока только development-версия, но уже можно попробовать:

pip install https://github.com/ezyatev/wsceleryactivity/zipball/master

Запустить сервер можно прямо из Celery:

celery wsceleryactivity -A proj --address=127.0.0.1 --port=8001

Актуальная версия WSCeleryActivity доступна в репозитории.