【问题标题】:Advice on Python/Django and message queues [closed]关于 Python/Django 和消息队列的建议 [关闭]
【发布时间】:2010-10-02 01:57:02
【问题描述】:

我在 Django 中有一个应用程序,它需要在各种用例中向用户发送大量电子邮件。出于显而易见的原因,我不想在应用程序中同步处理。

有没有人推荐一个与 Python 很好集成的消息队列服务器,或者他们在 Django 项目中使用过?我的堆栈的其余部分是 Apache、mod_python、MySQL。

【问题讨论】:

    标签: python django message-queue


    【解决方案1】:

    在您的特定情况下,它只是一个电子邮件队列,我会采取简单的方法并使用django-mailer。作为一个不错的好处,还有其他可插入的项目足够聪明,可以在堆栈中看到 django-mailer 时利用它。

    至于更通用的队列解决方案,我还没有尝试过其中的任何一个,但这里列出了一些我觉得更有趣的解决方案:

    1. pybeanstalk/beanstalkd
    2. python interface to gearman(随着C version of gearman 的发布,现在可能更有趣了)
    3. memcacheQ
    4. stomp
    5. Celery

    【讨论】:

    • 对于这个特定的需求,避免麻烦并使用 django-mailer;效果很好。 +1
    • 我现在正在试验pypi.python.org/pypi/celery,它看起来非常非常好。
    【解决方案2】:

    到目前为止,我还没有找到“好的”解决方案。我有一些更严格的软实时要求(从贴有标签的纸板箱中拍照)所以可能其中一种方法对您来说足够快。我假设电子邮件可以等待几分钟。

    • 数据库中由 cron 作业处理的“待办事项列表”。
    • 数据库中的“待办事项列表”由守护程序轮询永久处理。
    • 使用自定义守护程序,该守护程序由网络服务器通过 UDP 数据包通知(今天在生产中)。基本上是我自己的队列系统,带有用于处理队列的 IP 堆栈。
    • Using ActiveMQ as a message broker - 由于稳定性问题,这没有成功。对我来说,Java 守护进程通常都比较丰满
    • 在 CouchDB 中使用更新触发器。不错,但更新触发器不适合进行繁重的图像处理,因此不适合我的问题。

    到目前为止,我还没有尝试过 RabbitMQ 和 XMPP/ejabebrd 来处理这个问题,但它们在我接下来要尝试的事情列表中。 RabbitMQ 在 2008 年获得了不错的 Python 连接,并且有大量的 XMPP 库。

    但也许您只需要在本地机器上正确配置邮件服务器。这可能允许您将邮件同步转储到本地邮件服务器,从而使您的整个软件堆栈更加简单。

    【讨论】:

    • 你尝试了哪个版本的activemq?在我工作的地方,我们已经基于它编写了一个完整的 NMS,并且在较新的版本中遇到了问题,但在较旧的 4.x 版本中没有问题。
    • 我依稀记得我们使用了 4.x“稳定”和 beta 版本。
    • 顺便说一句:我们现在在生产中使用 RabbitMQ,到目前为止,我们都非常高兴。
    【解决方案3】:

    Stompserver 是一个不错的选择。它轻量级、易于安装且易于从 Django/python 中使用。

    我们有一个系统在生产中使用 stompserver 来异步发送电子邮件和处理其他工作。

    Django 将电子邮件保存到数据库,Django 中的 model.post_save 处理程序向 stompserver 发送事件,然后 stompserver 将事件传递给执行异步任务(发送电子邮件)的消费者进程。

    它可以很好地扩展,因为您可以在运行时添加消费者进程 - 两个消费者可以发送两倍的电子邮件,并且消费者可以在不同的机器上。一个轻微的复杂性是每个消费者都需要自己的命名队列,因此 Django 需要知道有多少消费者可用,并以循环方式向每个队列发送事件。 (在同一个队列上监听的两个消费者都将得到每个消息 = 重复)。如果您只想要一个消费者进程,那么这不是问题。

    我们以前的进程会不断地轮询数据库以查找作业,但发现它给系统增加了很多负载,即使不需要处理任何事情。

    【讨论】:

      【解决方案4】:

      只需将电子邮件添加到数据库中,然后编写另一个由某个任务计划程序实用程序(想到 cron)运行的脚本来发送电子邮件。

      【讨论】:

        【解决方案5】:

        您可能想看看pymq。它是用 python 编写的,与它的客户端进行 HTTP 通信,并允许对队列进行大量监控和管理选项。

        【讨论】:

          【解决方案6】:

          使用邮件基础设施解决这个问题有什么问题吗?就像,每个运行自己的邮件守护进程的应用服务器都会将任何本地提交的邮件排队,然后转发到可以处理邮件繁重工作的集中式邮件服务器?

          【讨论】:

            【解决方案7】:

            如果您已经安装了 MySQL,您可以创建一个表以用作各种“待办事项列表”。

            线程同步地将作业添加到表中,批处理任务在作业完成后删除它们。

            这样,无需安装和学习更多软件,只要您不发送大量电子邮件(例如 >10/秒)。

            【讨论】:

              【解决方案8】:

              这是一个懒惰但正确且充分的解决方案。使用以下数据库表作为队列。

              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
              );
              

              发件人应在此表的末尾插入新行。

              设置工作线程从另一端(最低 id)一次弹出一封邮件并尝试发送它们。

              【讨论】:

                猜你喜欢
                • 2010-10-18
                • 2011-05-19
                • 2018-07-06
                • 2011-01-28
                • 2013-07-02
                • 1970-01-01
                • 2017-04-14
                • 2013-12-15
                • 2011-04-30
                相关资源
                最近更新 更多