3

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

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

让我深入了解更多细节并澄清问题。

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

这让我可以提出以下问题:

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

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

让我猜猜。当我们提交一个新请求时,他们会查看从当前时刻起最后一秒提交的请求数量,如果这个数量小于我们的限制,那么请求就会被接受。

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

研究

Amazon SES 博客上有一篇关于处理限制的精彩博文。我们正在尝试采用这种方法,但尚未成功。

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

我想这是很常见的任务,但出于某种原因,我并不幸运地找到了完整的解决方案。


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

4

1 回答 1

1

关键是:

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

根据您所说的,您似乎正在使用一些模糊逻辑来尝试计算您发送的消息数量。这并不完美,因此如果您的 AWS 限制为 90p/s,那么将代码设置得更低,例如 60p/s 是有意义的(这再次取决于您的估计有多准确)。

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

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

于 2013-09-12T04:07:52.473 回答