【问题标题】:AWS SES sends emails to multiple recipients too slowlyAWS SES 向多个收件人发送电子邮件的速度太慢
【发布时间】:2012-01-24 07:52:09
【问题描述】:

我创建了一个作业队列模块,用于处理作业并构建“社交网络”类型的电子邮件。 2个过程包括:

  1. 构建自定义电子邮件(视图),例如User A and User B have commented on your postUser B and User C also likes User C's post。每个收件人都会收到不同的电子邮件。我最初创建了一个新的Swiftmailer 实例并添加了消息内容、主题和收件人。然后我将这些实例添加到数据库中。

  2. 运行一个 cron 作业以获取并稍后发送这些电子邮件。

在进行基准测试时,我意识到它平均每秒发送 2 封电子邮件。所以我尝试将Swift_Message Instances 存储在数据库中。不过运气不好,仍然需要很长时间。

目前,代码

  • 创建一个新的Swift_SmtpTransport
  • 创建一个新的Swift_Mailer 实例。
    • 循环遍历从数据库中检索到的 Swift_Message 消息
    • 发送每封电子邮件。

但它仍然平均每秒大约 2 封电子邮件。有什么方法可以改进流程以加快交付速度?我使用 Amazon SES 作为我的 SMTP 传输,我知道它每秒至少可以处理 5 封电子邮件。

所以这可能是我做错了什么。任何想法表示赞赏。

编辑

请记住,每个收件人的邮件都不同。我可以试试Swift_Decorator 插件,但这意味着我必须改变视图的生成方式。我只是在寻找其他替代方案来加快这一进程。

【问题讨论】:

    标签: php kohana-3 swiftmailer amazon-ses


    【解决方案1】:

    我使用 Amazon SES 作为我的 SMTP 传输

    根据我使用 SES 的经验,我看到的最小 API 响应时间一直在半秒范围内,而平均值徘徊在 1 秒左右。这不是对连接、TCP/IP、可用带宽等的限制,而是对每个连接的它们处理请求的限制。官方支持论坛上的其他人也报告了同样的情况。 SMTP 传输并没有更快。

    发送更快的唯一方法是并行发送。这是他们在官方支持论坛上推荐的方法。

    只要您保持在“每秒邮件数”配额内,SES API 就允许多个同时连接。如果您不知道当前的每秒配额,请检查您的发送统计信息。我不知道 SMTP 传输句柄是否超过了这个限制。

    为了并行发送更多邮件,我们修改了队列处理器,使其能够并行运行。为了确保邮件不会被发送两次,我们在表中添加了一个“PID x 抓取了这个”列,并运行了类似于UPDATE Queue SET selected_pid = ? WHERE target_ts < NOW() AND selected_pid IS NULL LIMIT X 的查询。然后,我们会寻找我们可以发送的邮件,将它们全部发送,然后重试,直到我们在此期间需要发送的邮件用完为止。

    我们还修改了填充队列的代码,以确保队列中的邮件永远不会超过我们可以发送的数量。我们能够做到这一点是因为我们分批发送邮件。当您有源源不断的邮件时,您可能不需要跳过那个圈。只需确保您的发送代码知道如何正确响应各种超出配额的错误。

    作为基于 cron 的队列处理器的替代方案,考虑使用 Gearman 设置一组异步后台工作程序来发送邮件。

    【讨论】:

      猜你喜欢
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 2019-11-04
      • 1970-01-01
      • 2017-12-05
      相关资源
      最近更新 更多