Python / Django AMQP? - PullRequest
       13

Python / Django AMQP?

2 голосов
/ 24 февраля 2011

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

Каков рекомендуемый способ выполнения таких задач?

  • Должно быть надежно (не пропускаются задания, если служба случайно остановлена).
  • Должен быть простой способ найти логи, если что-то пойдет не так.
  • Я хочу иметь возможность легко добавлять больше работников, которые будут обрабатывать задания.

  • Возможно, будет лучше, если очередь заданий будет из той же базы данных.таблицу, чтобы я мог легко отменить задания, просто изменив их статус в базе данных?

  • Может быть, будет лучше, если решение каким-то образом связано со структурой Django?1021 *

Ответы [ 2 ]

6 голосов
/ 24 февраля 2011

Я бы хотел использовать http://celeryproject.org/, и в вашем случае вы, вероятно, могли бы использовать https://github.com/ask/django-celery, чтобы упростить интеграцию с существующим приложением, хотя само использование сельдерея в вашем проекте django также должно быть довольно простым.

Celery предоставляет основанную на функции / классе абстракцию для задач, которые должны выполняться асинхронно на рабочих машинах.Вы можете иметь несколько рабочих машин и динамически добавлять рабочих.Все это работает на RabbitMQ (www.rabbitmq.com), поэтому ваше приложение django помещает задачи в очередь, выполняя в основном что-то вроде:

from mycelerytasks import send_email

...

deferred_result = send_email.apply_async(*args, **kwargs)

Если вы хотите подождать, пока задача завершит васможет сделать deferred_result.wait(), но в вашем случае вы, вероятно, просто откажетесь от него и дадите завершить свое представление, чтобы пользователь не ждал ответа.

1 голос
/ 24 февраля 2011

Я не уверен, что это то, что вам нужно, но я справляюсь с этим с помощью периодического задания cron на моем linux-сервере, запускающего скрипт на python.(Запланированное задание будет эквивалентно в Windows)

Вы можете получить доступ к модулям и настройкам вашего проекта в скрипте python, управляя списком sys.path, например:

import sys
import os
sys.path.append( PATH_TO_PROJECT_DIR )
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...