0

我创建了一个作业队列模块,用于处理作业并构建“社交网络”类型的电子邮件。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实例存储在数据库中。虽然没有运气,仍然需要很长时间。

目前,代码

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

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

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

编辑

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

4

1 回答 1

2

我使用 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设置一组异步后台工作程序来发送邮件。

于 2012-01-25T06:12:52.513 回答