由于限制错误,无法达到Amazon SES发送限制

时间:2013-02-27 07:39:16

标签: php amazon-ses throttling

我们使用SES API通过Amazon SES发送消息。我们的发送速率现在是每秒90条消息。但即使我们没有达到这个限制,我们也会得到throttling exception,但只是试图接近它。

现在我们可以稳定地以每秒30条消息的速度发送。问题是如何更快地发送。

让我深入了解一些细节并澄清问题。

  • 单个API发送请求可能需要0.3到3秒才能完成。这就是为什么如果我们按顺序发送消息,我们很难获得每秒1条消息的速度。
  • 幸运的是,我们可以并行发送消息,这就是我们正在做的事情。
  • 对于每个线程,我们检查它每秒发送的消息数量是否超过允许的数量。例如,如果我们有40个线程,那么我们不允许每个线程每秒发送超过2个消息。是的,这不是最佳选择。
  • 我们注册每个发送的消息和API请求完成的时间(当我们从API获得响应时)。这样可以获得一些统计数据。
  • 当我们将发送限制限制为小于允许限制(例如60而不是90)时,一切正常。
  • 当我们尝试以最大限度发送时,我们开始遇到限制错误。就像每秒达到80个请求的速度一样,我们开始获得例外。

这让我可以提出问题:

问:如何发送允许速度最快的邮件?

让我们从另一个问题开始 - “SES如何计算检查发送速率的消息数量?”

让我猜一下。当我们提交新请求时,他们会查看从当前时刻起最后一秒内提交的请求数量,如果此数字小于我们的限制,则接受请求。

但是等等。如果我们有40个线程,并且每个线程每秒不能发送超过2条消息,那么我们永远不会达到限制。但我们确实得到了例外。

研究

Amazon SES博客上有一个关于处理限制的好blog post。我们正试图采用这种方法但尚未成功。

我们在应用程序和PHP SES SDK中使用PHP。

我想这是一项非常常见的任务,但由于某种原因,我找不到完整的解决方案是不幸的。


非常感谢任何帮助或想法。谢谢。

1 个答案:

答案 0 :(得分:1)

关键是:

  

各种因素都会影响您的发送率,例如:邮件大小,   网络性能或Amazon SES可用性。

根据您的说法,您似乎正在使用一些模糊逻辑来尝试计算您发送的邮件数量。这不是完美的,所以如果你的AWS限制为90p / s,那么设置你的代码更低,e / g到60p / s是有意义的(再一次这取决于你的估计的准确度)。

您应该考虑您提到的其他方法,例如您提供的链接中所述的“指数退避”。

您可以考虑的另一件事是利用队列,例如SQS。这样你就可以尽快从列表中选择任务,如果你有点太快,你可以随时退回然后尽快跳回队列。