Сельдерей использует Django Result Backend для удаленных задач - PullRequest
0 голосов
/ 21 января 2019

У меня есть приложение Django, которое использует Celery для создания асинхронных задач.Некоторые из этих задач находятся в проекте Django, а другие - на удаленном работнике с собственной базой кода.

В настоящее время я использую пакет django-celery-results для хранения результатов вызовов задач в базе данных Django, так что яможет легко запросить статус звонков, используя Django ORM.Это прекрасно работает, когда я называю свои «локальные» задачи, но, похоже, не работает, когда я вызываю удаленные задачи.

Например:

app.send_task("django.foo")  # Return status SUCCESS and store result in DB
app.send_task("remote.bar")  # Stuck in PENDING and never create result in DB

При чтении Celery Docs Я обнаружил, что задачи могут зависнуть в PENDING, если клиент и работник не используют одну и ту же настройку CELERY_RESULT_BACKEND.В этом случае я не могу использовать django-db бэкэнд на своем удаленном работнике, поскольку это не приложение Django.

Так что в этом случае ... Как мне сохранить результаты при выполнении удаленных вызовов в этомманера?

Обратите внимание, что в случае remote.bar я подтверждаю, что удаленный работник получает сообщение и выполняет метод.Просто мой клиент (приложение Django) не получает ответ.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Как уже говорилось в другом ответе, вы можете настроить result_backend.Я должен был указать это с Celery(result_backends=....), так как URL-адрес SQL, который я установил в настройках Django, игнорировался.Однако проблема этого подхода заключается в том, что вам необходимо предоставить прямой доступ к базе данных, что упрощает работу, но не обеспечивает ее безопасность, если ваши сотрудники из сельдерея должны находиться в другой сети.

Если безопасностьЭто проблема, вам придется создавать API для обновления результатов от клиента.Вот более подробное объяснение такого подхода.

REST API или «прямой» доступ к базе данных для удаленных работников Celery / Django?

0 голосов
/ 21 января 2019

nb, если разные работники сельдерея используют разные бэкэнды результатов, вы можете настроить экземпляр app на лету.

from celery.app import Celery
app = Celery(broker_url='my_broker_url', result_backend='non-django-orm backend')
result = app.send_task('remote.bar')
# you can check status here just fine.

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

...