代码之家  ›  专栏  ›  技术社区  ›  Andy Hume

关于Python/Django和消息队列的建议

  •  42
  • Andy Hume  · 技术社区  · 16 年前

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

    有人对与Python集成良好的消息队列服务器有什么建议吗,或者他们在Django项目中使用过吗?我的堆栈的其余部分是Apache、mod_python和MySQL。

    9 回复  |  直到 16 年前
        1
  •  24
  •   Kevin Woblick    4 年前

    django-mailer . 作为一个很好的补充,还有其他一些可插入项目,它们足够聪明,可以在堆栈中看到django mailer时利用它。

    至于更通用的队列解决方案,我还没有尝试过其中任何一种,但下面列出了一些我更感兴趣的解决方案:

    1. pybeanstalk/beanstalkd
    2. python interface to gearman (随着 C version of gearman )
    3. memcacheQ
    4. stomp
    5. Celery
        2
  •  14
  •   max    15 年前

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

    • 由cron作业处理的数据库中的“待办事项列表”。
    • 数据库中的“待办事项列表”被守护进程永久轮询处理。
    • 使用一个定制的守护程序,该守护程序通过UDP数据包由Web服务器通知(目前已投入生产)。基本上是我自己的Queing系统,带有处理队列的IP堆栈。
    • Using ActiveMQ as a message broker
    • 在CouchDB中使用更新触发器。不错,但更新触发器并不意味着要做繁重的图像处理,所以不适合我的问题。

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

        3
  •  6
  •   Gruff    15 年前

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

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

    以前,我们有一些进程不断地轮询数据库中的作业,但发现它给系统增加了很多负载,即使没有什么需要处理的。

        4
  •  1
  •   nosklo    16 年前

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

        5
  •  1
  •   dhruvbird    14 年前

    你可能想看看 pymq . 它是用python编写的,与客户机进行HTTP对话,并允许对队列进行大量监视和管理选项。

        6
  •  1
  •   Sandip Bhattacharya    14 年前

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

        7
  •  0
  •   James Brady    16 年前

    如果已经安装了MySQL,则可以创建一个表,用作排序的“待办事项列表”。

    线程同步地向表中添加作业,批处理任务在作业完成时删除作业。

    太多了 电子邮件的数量(如超过10/秒)。

        8
  •  0
  •   Seun Osewa    12 年前

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

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

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