在不超过速率限制的情况下尽快通过 SES 发送电子邮件

rhy*_*thm 3 email rate-limiting node.js amazon-ses aws-sdk

我目前正在使用 SendGrid 从许多无服务器 Node.js Lambda 函数发送电子邮件,并计划从 SendGrid 转移到 SES(因为价格合理)。

SendGrid 的速率限制如此之高,以至于通过某些 lambda 函数同时使用 for 循环向用户发送电子邮件永远不会造成问题。但SES的速率限制较低(我的例子是每秒50封电子邮件),并且会出现超出最大发送速率限制的错误。

如何才能在不超过速率限制的情况下尽可能快地发送电子邮件?

我当前的计划是通过许多 lambda 函数向 SQS 队列发送电子邮件请求,并通过 1 个不停运行的 Lambda 函数接收 SQS 消息以发送电子邮件。但我不知道如何控制向SES发送请求的速度。

rhy*_*thm 8

我的结论

我决定创建两个 SQS 队列(A 和 B)。队列B用于触发邮件发送功能,队列A用于向等待队列中添加消息。所以我只需要控制将消息从队列 A 移动到 B 的速度,这使得一切变得简单。

在此输入图像描述

我考虑了以下几点。

错误处理

起初,我考虑使用 while 循环通过单个 Lambda 函数发送多封电子邮件,但这使得错误处理变得困难。当超出速率限制错误或发生其他意外异常时,需要等待一段时间然后重试,但可能会超过 Lambda 函数的超时时间。

可扩展性

通过单个 Lambda 函数在 1 秒内从 SQS 队列接收 50 条消息并向 SES 发送 50 个请求是可能的,但如果速率限制达到 300 或 500,则可能无法在一秒钟内处理那么多请求。将消息从一个 SQS 队列移动到另一个队列,以便为每封电子邮件调用 Lambda 函数,是相对容易扩展的。

电子邮件优先

带有验证码的注册确认电子邮件需要立即发送,但活动电子邮件可以延迟发送。通过两个SQS队列,我可以控制优先级。

AWS成本

为每封电子邮件调用 Lambda 函数比在单个 Lambda 函数中发送多封电子邮件需要更多时间,但 AWS 成本并不是很昂贵。如果向 SES 发送请求需要 1 秒,则使用 128 MB 内存(弗吉尼亚北部地区)执行 Lambda 的成本为 0.000002083 美元。1000 封电子邮件只需 0.02083 美元,可以忽略。