【问题标题】:Django smpt email backend slowing down performanceDjango smtp emailbackend 降低性能
【发布时间】:2019-07-06 17:54:00
【问题描述】:

我目前正在本地开发/服务。

我正在使用 django-admin 为内部用户添加项目。

我添加了我的信号代码。我的信号是 post_save,其目的是向用户发送电子邮件以供批准。我使用 console.EmailBackend 测试我的信号

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

我添加了一个新项目,对网络浏览器没有性能影响。我的模型项目页面会快速重新加载。

我更新我的 EMAIL_BACKEND 也使用 smpt 详细信息

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

我添加了一个新项目,性能影响很大,我的网络浏览器现在需要 15-30 秒才能在添加后重新加载项目页面。

关于为什么性能如此糟糕的任何想法?

【问题讨论】:

    标签: django django-admin django-signals django-email


    【解决方案1】:

    真正的电子邮件发送本质上很慢。

    我建议使用异步队列任务发送电子邮件。例如 Celery 是 asynchronous Queue task 的好库。

    【讨论】:

    • 这就是我的想法,所以信号不是异步的......嗯
    • 你有例子吗?
    • this question@RachOdwyer
    • 谢谢,作为 POC 的权宜之计,我将采取简单的方法并使用 django-celery-email,但是一旦在运行 celery、rabbit 的开发环境中,我将使用以上
    【解决方案2】:

    如果您计划在 AWS 或类似设备上运行您的应用程序,请考虑使用电子邮件发送服务(例如 AWS 的 SES)。它将允许您设置发件人验证 (DKIM/SPF),它将是一个低延迟的 API 调用,而不是缓慢的 SMTP 交互。如果您打算使用 AWS,那么已经有一个库 django-ses,您可以立即对其进行配置并开始使用。

    如果您想继续自己发送电子邮件,请使用celerychannels 设置异步任务队列和工作线程。这种延迟将让您的 Web Worker 继续处理请求,而该 Worker 完成缓慢的发送过程。

    如果您想要一个真正快速的设置,您可以结合上述两种方法,将电子邮件发送推迟到异步工作人员,然后该工作人员点击电子邮件即服务 API。你的网络工作者会很敏捷,并且你的异步工作者不会在 10-15 秒内被阻止与 SMTP 服务器对话!

    【讨论】:

    • 谢谢,作为 POC 的权宜之计,我将采取简单的方法并使用 django-celery-email,但是一旦在运行 celery、rabbit 的开发环境中,我将使用以上
    猜你喜欢
    • 2020-06-02
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2019-11-15
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多