我在Heroku上有rails 4应用程序通过deliver_later
发送电子邮件。 Sidekiq正在运行和工作,我的配置中有config.active_job.queue_adapter = :sidekiq
。
我也在日志[ActiveJob] [ActionMailer::DeliveryJob]
中看到这一点,这让我相信电子邮件是作为后台工作发送的。
那为什么我每秒仍会收到太多电子邮件的错误?
Net :: SMTPUnknownError:无法获得3xx(550:550 5.7.0未采取请求的操作:每秒发送的电子邮件太多
我刚注意到我将sidekiq并发设置为3.也许这就是问题?
答案 0 :(得分:2)
这与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服务器。
答案 1 :(得分:1)
似乎是将sidekiq并发设置为3的问题。
其他信息:将并发设置为1可以解决问题,但我不希望单个工作程序处理所有作业。如果Sidekiq允许每个队列使用集合并发,这将是很好的,因此电子邮件可以使用单个工作程序,而其他工作可以使用多个工作程序。然而,sidekiq作者说这是不可能的。
我使用heroku找到了我的特定问题here的解决方案,其中涉及将每个队列放入其自己的heroku dyno中,这允许您在每个dyno中设置并发性。