1

几天前,我们在从 Rails 应用程序发送电子邮件时开始遇到问题。这是错误的回溯:

mail-2.4.4/lib/mail/body.rb:143→ get_best_encoding
mail-2.4.4/lib/mail/body.rb:156→ encoded
mail-2.4.4/lib/mail/message.rb:1710→ encoded
actionmailer-3.2.8/lib/action_mailer/base.rb:434→ set_payload_for_mail
actionmailer-3.2.8/lib/action_mailer/base.rb:414→ block in deliver_mail
activesupport-3.2.8/lib/active_support/notifications.rb:123→ block in instrument
activesupport-3.2.8/lib/active_support/notifications/instrumenter.rb:20→ instrument
activesupport-3.2.8/lib/active_support/notifications.rb:123→ instrument
actionmailer-3.2.8/lib/action_mailer/base.rb:413→ deliver_mail
mail-2.4.4/lib/mail/message.rb:229→ deliver
!===> app/controllers/password_resets_controller.rb:16→ create <===!
actionpack-3.2.8/lib/action_controller/metal/implicit_render.rb:4→ send_action
actionpack-3.2.8/lib/abstract_controller/base.rb:167→ process_action

我已经突出显示了指向我们代码的行。其余的是 gem / rails 代码。可能需要注意的是,在这种环境中,我们通过 delay_job 发送一些电子邮件,而没有它的其他一些电子邮件。上面的堆栈跟踪指的是没有延迟作业发送的电子邮件。

我们已经能够在应用了以下更改的开发环境中重现该问题:

  • Rails 已升级到 3.2.9 而不是 3.2.8
  • Ruby 已升级到 1.9.3-p327 而不是 1.9.3-p194
  • Delayed_job 现在发送所有电子邮件。并且被撞到了 3.0.4 而不是 3.0.3

这是开发环境中错误的回溯:

mail (2.4.4) lib/mail/body.rb:143:in `get_best_encoding'
mail (2.4.4) lib/mail/body.rb:156:in `encoded'
mail (2.4.4) lib/mail/message.rb:1710:in `encoded'
actionmailer (3.2.9) lib/action_mailer/base.rb:434:in `set_payload_for_mail'
actionmailer (3.2.9) lib/action_mailer/base.rb:414:in `block in deliver_mail'
activesupport (3.2.9) lib/active_support/notifications.rb:123:in `block in instrument'
activesupport (3.2.9) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (3.2.9) lib/active_support/notifications.rb:123:in `instrument'
actionmailer (3.2.9) lib/action_mailer/base.rb:413:in `deliver_mail'
mail (2.4.4) lib/mail/message.rb:229:in `deliver'
delayed_job (3.0.4) lib/delayed/performable_mailer.rb:6:in `perform'
delayed_job (3.0.4) lib/delayed/backend/base.rb:95:in `block in invoke_job'
delayed_job (3.0.4) lib/delayed/lifecycle.rb:60:in `call'
delayed_job (3.0.4) lib/delayed/lifecycle.rb:60:in `block in initialize'
delayed_job (3.0.4) lib/delayed/lifecycle.rb:65:in `call'
delayed_job (3.0.4) lib/delayed/lifecycle.rb:65:in `execute'
delayed_job (3.0.4) lib/delayed/lifecycle.rb:38:in `run_callbacks'
delayed_job (3.0.4) lib/delayed/backend/base.rb:92:in `invoke_job'
delayed_job (3.0.4) lib/delayed/backend/base.rb:37:in `block in enqueue'
delayed_job (3.0.4) lib/delayed/backend/base.rb:36:in `tap'
delayed_job (3.0.4) lib/delayed/backend/base.rb:36:in `enqueue'
delayed_job (3.0.4) lib/delayed/message_sending.rb:13:in `method_missing'
!===> app/controllers/password_resets_controller.rb:16:in `create' <===!
actionpack (3.2.9) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
actionpack (3.2.9) lib/abstract_controller/base.rb:167:in `process_action'

据我们所见,除了delayed_job 部分和gem 版本之外,它似乎是完全相同的堆栈跟踪。

我们的应用程序控制器的第 16 行在我们的开发环境中如下所示:

UserMailer.delay(:queue => "mail").password_reset_instructions(@user)

在产品中是:

UserMailer.password_reset_instructions(@user).deliver

棘手的部分是这个错误是“随机的”。它不会每次都发生,当它不发生时,邮件发送成功。

这里有两个观察:

  • 当错误发生在一封电子邮件中时,它会每次都发生在同一封电子邮件中。“相同的电子邮件”是指在同一个控制器中执行相同的操作,而不管参数如何。
  • 因此,一封电子邮件可能被窃听,而其他电子邮件则正常。
  • 对于所有电子邮件,重新启动服务器始终可以解决问题。但只是一段时间。
  • 我们还没有找到可以 100% 置信度触发错误的操作序列。

我们已经调查了几天这个错误,但我们真的在这里碰壁了。你知道我们可能做错了什么吗?

4

0 回答 0