Error: too many emails per second on Heroku
Error: too many emails per second on Heroku
我在 Heroku 上有 rails 4 个应用程序通过 deliver_later
发送电子邮件。 Sidekiq 运行 正在运行,我的配置中有 config.active_job.queue_adapter = :sidekiq
。
我也在日志中看到了这一点 [ActiveJob] [ActionMailer::DeliveryJob]
这让我相信电子邮件是作为后台作业发送的。
那么,为什么我仍然会收到有关每秒电子邮件过多的错误消息?
Net::SMTPUnknownError: could not get 3xx (550: 550 5.7.0 Requested action not taken: too many emails per second
我刚刚注意到我将 sidekiq 并发设置为 3。也许这就是问题所在?
sidekiq 并发设置为 3 似乎确实是个问题。
其他信息:将并发设置为 1 可以解决问题,但我不希望所有作业都由单个工作人员处理。如果 Sidekiq 允许使用每个队列的并发设置,那么电子邮件可以使用单个工作人员而其他工作可以使用多个工作人员,那就太好了。但是,sidekiq作者说不可能。
我使用 heroku 找到了解决我的特定问题 here 的方法,它涉及将每个队列放在它自己的 heroku dyno 中,它允许您在每个 dyno 中设置并发性。
这不会与 Sidekiq 相关(嗯,无论如何不会直接相关)。这与您使用的任何 SMTP 服务器和服务器的速率限制有关。如果您有多个 Sidekiq 实例几乎同时发送电子邮件,并且您的速率限制相对较低,则可能会抛出此错误。
例如,如果您在开发或临时环境中使用 Mailtrap 作为 SMTP 服务器,则免费帐户每秒限制为 2 封电子邮件。很容易运行进入这个错误。
如果出于您的目的,您无法避免 运行 解决这个问题,您可以通过为 ActionMailer 的 deliver_later method 使用关键字参数 'wait' 来尝试一些不同的策略,例如:
users_i_need_to_email.each_with_index do |user, index|
t = 5 * index
UserMailer.send_important_stuff(user)
.deliver_later(wait: t.seconds)
end
如果您的 :deliver_later 呼叫在不同的进程或流程中运行,您可以通过随机化传递时间(例如,一些随机时间长达 5 分钟)来摆脱困境。
显然,上述两种解决方案都不是充分的证据,因此您最好使用适合您的目的的 SMTP 服务器。
我在 Heroku 上有 rails 4 个应用程序通过 deliver_later
发送电子邮件。 Sidekiq 运行 正在运行,我的配置中有 config.active_job.queue_adapter = :sidekiq
。
我也在日志中看到了这一点 [ActiveJob] [ActionMailer::DeliveryJob]
这让我相信电子邮件是作为后台作业发送的。
那么,为什么我仍然会收到有关每秒电子邮件过多的错误消息?
Net::SMTPUnknownError: could not get 3xx (550: 550 5.7.0 Requested action not taken: too many emails per second
我刚刚注意到我将 sidekiq 并发设置为 3。也许这就是问题所在?
sidekiq 并发设置为 3 似乎确实是个问题。
其他信息:将并发设置为 1 可以解决问题,但我不希望所有作业都由单个工作人员处理。如果 Sidekiq 允许使用每个队列的并发设置,那么电子邮件可以使用单个工作人员而其他工作可以使用多个工作人员,那就太好了。但是,sidekiq作者说不可能。
我使用 heroku 找到了解决我的特定问题 here 的方法,它涉及将每个队列放在它自己的 heroku dyno 中,它允许您在每个 dyno 中设置并发性。
这不会与 Sidekiq 相关(嗯,无论如何不会直接相关)。这与您使用的任何 SMTP 服务器和服务器的速率限制有关。如果您有多个 Sidekiq 实例几乎同时发送电子邮件,并且您的速率限制相对较低,则可能会抛出此错误。
例如,如果您在开发或临时环境中使用 Mailtrap 作为 SMTP 服务器,则免费帐户每秒限制为 2 封电子邮件。很容易运行进入这个错误。
如果出于您的目的,您无法避免 运行 解决这个问题,您可以通过为 ActionMailer 的 deliver_later method 使用关键字参数 'wait' 来尝试一些不同的策略,例如:
users_i_need_to_email.each_with_index do |user, index|
t = 5 * index
UserMailer.send_important_stuff(user)
.deliver_later(wait: t.seconds)
end
如果您的 :deliver_later 呼叫在不同的进程或流程中运行,您可以通过随机化传递时间(例如,一些随机时间长达 5 分钟)来摆脱困境。
显然,上述两种解决方案都不是充分的证据,因此您最好使用适合您的目的的 SMTP 服务器。