我使用ActionMailer,SendGrid和DelayedJob / Resque在Heroku上获得了一个Rails 4.2.5应用程序,用于后台处理。我有一个奇怪的问题,我无法在localhost上重现。
我发了一批电子邮件。不会出现任何错误,因此电子邮件似乎已成功发送出去。然后,我检查SendGrid的活动标签,看看那里只有一半的电子邮件。
我还没有使用SendGrid或ActionMailer做很多事情,所以我不确定如何调试问题或在本地重现它。我已经尝试通过在我的应用中创建100 contacts
然后向他们发送相同的通知消息(就像应用程序在生产中会发生的那样)进行复制,但它们都成功完成。
在development.rb
和production.rb
我有:
config.action_mailer.raise_delivery_errors = true
在production.rb
我有:
config.action_mailer.default_url_options = { :host => 'http://firmplay.com' }
# config.action_mailer.delivery_method = :sendmail
# config.action_mailer.sendmail_settings = {
# :location => '/usr/sbin/sendmail',
# :arguments => '-i -t'
# }
# config.action_mailer.perform_deliveries = true
# config.action_mailer.raise_delivery_errors = true
我不确定评论的代码是否应该取消注释。
在environment.rb
我有:
ActionMailer::Base.smtp_settings = {
:address => 'smtp.sendgrid.net',
:port => '587',
:authentication => :plain,
:user_name => ENV['SENDGRID_USERNAME'],
:password => ENV['SENDGRID_PASSWORD'],
:domain => 'heroku.com',
:enable_starttls_auto => true
}
在application.rb
我有:
config.active_job.queue_adapter = :resque
我不确定我在这里做错了什么,甚至在问题出现时,我怀疑它与我最近从Rails 4.0升级到4.2.5有关。我想知道电子邮件是否在DelayedJob / Resque的某个地方失败了,所以我检查了Resque日志,没有发现任何异常。
使用部分解决方案进行更新
我设法在解决这个问题方面取得了一些进展。当我在测试生产时,我意识到当使用我的web dyno将电子邮件排队为后台作业时,它会在10秒后超时,这是应用程序的限制。即使在网络工作者超时后,它仍继续排队电子邮件,直到内存不足(在日志中看到一些R14错误)。
在排队电子邮件时,我无法确定内存耗尽的原因。我并没有将电子邮件存储在内存中作为变量,但我认为当我遍历我的联系人列表时,它们可能会被无意中存储起来。
我最终做的是创建一个后台作业,我可以将联系人列表传递给。然后后台作业直接发送电子邮件。当我测试这种方法时,一切都很好,并且扩展得非常好。所以从本质上讲,我的问题已经解决了,尽管我仍然想知道为什么网络dyno在排队电子邮件时内存不足,而运行Resque的后台工作人员却没有遇到任何此类问题。
我最初使用.map
遍历我的联系人,它将每个循环内返回的最后一项存储在内存中。我改为.each
,认为这样可以解决问题,但事实并非如此。无论如何,问题似乎是Ruby将电子邮件存储在内存中以供控制器使用。