2013-02-27 63 views
2

我们使用SES API向Amazon SES发送消息。我们的发送速率现在是每秒90条消息。但是即使我们没有达到这个极限,我们也会得到throttling exception,只是试图接近它。由于节流错误无法达到Amazon SES发送限制

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

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

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

这让我提出的问题:

问:如何发送与允许的最高速度的消息?

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

让我猜。当我们提交新请求时,他们会查看当前时刻上一秒内提交的请求数量,如果此数量少于我们的限制,则接受请求。

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

研究

有亚马逊SES博客有关操作的限制很大blog post。我们正在尝试采用这种方法,但尚未成功。

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

我想这是相当普遍的任务,但由于某种原因,我不幸找到完整的解决方案。


任何帮助或想法将不胜感激。谢谢。

回答

1

关键带走的是:

多种因素会影响你的发送速率,例如消息大小, 网络性能或Amazon SES可用性。

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

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

你可以考虑的另一件事是利用队列,如SQS。通过这种方式,您可以尽快地从列表中选择任务,如果速度太快,您可以始终退出,然后尽快跳回队列。

+0

我们使用PHP SES SDK进行批量发送。在发生节流或其他错误的情况下,SDK会为我们提供支持。我们已经发现了批量线程和消息数量的最佳配置,对我们来说工作正常。尽管我们并没有以尽可能高的速度发送,但毕竟我们对我们所拥有的东西没有问题。我们使用的是Gearman而不是SQS,负责发送消息的脚本除了发送外什么也不做。我认为这是你的建议。感谢您的评论。 – 2013-10-30 07:45:23

+0

如果您满意我的答案作为解决方案,随时将其标记为正确答案。 – 2013-12-07 06:13:28