Подтвердить что ты не робот

Советы по Python/Django и очередям сообщений

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

Есть ли какие-либо рекомендации для сервера очередей сообщений, который хорошо интегрируется с Python или они использовали в проекте Django? Остальная часть моего стека - Apache, mod_python, MySQL.

4b9b3361

Ответ 1

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

  • "Список дел" в базе данных, обработанной заданием cron.
  • Список "todo list" в базе данных, обработанный на постоянной основе демоном опроса.
  • Использование пользовательского демона, который уведомляется веб-сервером через UDP-пакет (в разделе "Производство сегодня" ). В основном моя собственная система Queing с IP-стеком для обработки очереди.
  • Использование ActiveMQ в качестве брокера сообщений - это не сработало из-за проблем с безопасностью. Также мне Java-демоны обычно несколько пухлые.
  • Использование триггеров обновления в CouchDB. Nice, но Update Triggers не предназначены для обработки тяжелых изображений, поэтому не подходят для моей проблемы.

До сих пор я не пробовал RabbitMQ и XMPP/ejabebrd для решения проблемы, но они находятся в моем списке следующих вещей, чтобы попробовать. В 2008 году RabbitMQ получил приличную возможность подключения к Python и существует множество библиотек XMPP.

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

Ответ 2

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

Что касается более общих решений очереди, я еще не смог попробовать ни одного из них, но вот список тех, которые выглядят более интересными для меня:

Ответ 3

Stompserver - хороший вариант. Он легкий, простой в установке и простой в использовании из Django/python.

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

Django сохраняет электронные письма в базе данных, обработчик model.post_save в Django отправляет событие в stompserver, а stompserver передает событие в процесс, который выполняет асинхронную задачу (отправляет электронное письмо).

Он масштабируется довольно хорошо, потому что вы можете добавлять потребительские процессы во время выполнения - два пользователя могут отправлять в два раза больше писем, а потребители могут находиться на отдельных машинах. Одно небольшое осложнение заключается в том, что каждому потребителю нужна собственная именованная очередь, поэтому Django должен знать, сколько потребителей доступно, и отправлять события в каждую очередь круговым способом. (Два абонента, прослушивающие одну и ту же очередь, получат каждое сообщение = дублирование). Если вам нужен только один потребительский процесс, это не проблема.

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

Ответ 4

Просто добавьте письма в базу данных, а затем напишите еще один script, запускаемый какой-то утилитой планировщика задач (cron приходит на ум), чтобы отправить электронные письма.

Ответ 5

Возможно, вам стоит взглянуть на pymq. Он написан на python, сообщает HTTP с его клиентами и позволяет множество параметров мониторинга и управления для очередей.

Ответ 6

Есть ли что-то неправильное в решении этой проблемы с использованием почтовой инфраструктуры? Например, каждый сервер приложений, на котором запущены собственные почтовые демоны, которые будут помещать в очередь любую локально отправленную почту, которая отправляется на централизованный почтовый сервер, который может выполнять тяжелую работу почты?

Ответ 8

Если у вас уже установлен MySQL, вы можете создать таблицу для использования в качестве списка "списка дел".

Нитки синхронно добавляют задания к таблице, а пакетная задача удаляет задания по мере их завершения.

Таким образом, нет необходимости устанавливать и изучать больше программного обеспечения, и оно должно работать нормально, как постоянное хранилище заданий, если вы не отправляете много сообщений электронной почты (например, > 10/сек).

Ответ 9

Здесь ленивое, но правильное и адекватное решение. Используйте следующую таблицу базы данных в качестве очереди.

drop table if exists mailqueue;
create table mailqueue (
    id bigint primary key,
    subject text not null,
    body mediumtext not null,
    from varchar(255) not null,
    to varchar(255) not null
);

Отправителям следует вставить новые строки в конец этой таблицы.

Настройте рабочие потоки для посылки почты по одному с другого конца (самый низкий идентификатор) и попробуйте отправить их.

Ответ 10

Вы также можете использовать Twisted для этого. Но во всех случаях он не будет играть с django, он очень зависит от сценариев развертывания. Самое главное, что каждый запрос должен обслуживаться одним процессом python, поэтому вам нужен apache, скомпилированный в поточном режиме.