Sidekiq 作业已安排,而不是 运行,只是消失了
Sidekiq job is scheduled, not running and just disappears
我正在开发一个 Rails 应用程序,它使用 Sidekiq 和 Mandrill 在后台发送电子邮件。
在我的应用程序中,我有 2 个队列,一个用于用户与我的服务交互(无关),第二个是邮件队列。
邮件队列由 2 个邮件程序使用:一个用于管理用户配置文件,另一个用于与我们的服务交互(无关)。
今天我注意到除了 Devise 发送的确认电子邮件外,用户已经几天没有收到电子邮件了。
另一个队列工作正常,没有任何问题。 (所以也许 Sidekiq 配置不是问题)。
例如,让我们以通知用户个人资料更新成功的 UserMailer 为例:
user_mailer.rb
def update_user(user)
@user = user
mail(:to => user.email)
end
user_profile_controller.rb
def update_resource(user)
user.save
UserMailer.update_user(user).deliver_later(wait: 1.minute)
end
当我尝试使用 deliver_now 而不是 deliver_later 测试此功能时,它成功了并且邮件被发送了(因此与 Mandrill 的连接正常)。
当我按原样测试这个功能时,作业被添加到邮件队列中。当需要发送电子邮件时,它只是从队列中消失,没有发送电子邮件,也没有在日志中留下任何异常。
我可以看到它出现在 Sidekiq Web 中 UI 然后消失了。
我猜确认邮件是唯一发送的邮件,因为它没有延迟,但我不知道为什么会这样。
在我的暂存环境中一切都运行良好。不同之处在于它与 mailtrap 一起工作并且没有生产那么多的工作。
一些可能相关的代码:
production.rb
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
:user_name => 'xxx',
:password => Rails.application.secrets.smtp_password,
:address => 'smtp.mandrillapp.com',
:domain => config.app_domain,
:port => 'xxx',
:authentication => :login
}
...
config.action_mailer.default_url_options = { :host => config.app_domain, :protocol => 'https' }
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = false
application.rb
config.active_job.queue_adapter = :sidekiq
在没有任何解决方案的情况下浏览了这些链接:
http://guides.rubyonrails.org/active_job_basics.html
http://api.rubyonrails.org/classes/ActionMailer/Base.html
没有找到与我的问题相关的任何其他链接。
- 尝试重新部署
- 已尝试重启 Sidekiq
- 已尝试重新启动 Redis
- 尝试重新启动服务器本身
- 尝试从控制台发送电子邮件 - 成功
- 尝试使用 deliver_later 发送电子邮件(等待:1 分钟)- 不成功
我怀疑这与服务器内存不足有关。当我增加服务器上的内存和 postgres 上的 max_connections 参数时,该队列中所有本应发送的电子邮件都立即送达
我正在开发一个 Rails 应用程序,它使用 Sidekiq 和 Mandrill 在后台发送电子邮件。 在我的应用程序中,我有 2 个队列,一个用于用户与我的服务交互(无关),第二个是邮件队列。 邮件队列由 2 个邮件程序使用:一个用于管理用户配置文件,另一个用于与我们的服务交互(无关)。
今天我注意到除了 Devise 发送的确认电子邮件外,用户已经几天没有收到电子邮件了。
另一个队列工作正常,没有任何问题。 (所以也许 Sidekiq 配置不是问题)。
例如,让我们以通知用户个人资料更新成功的 UserMailer 为例:
user_mailer.rb
def update_user(user)
@user = user
mail(:to => user.email)
end
user_profile_controller.rb
def update_resource(user)
user.save
UserMailer.update_user(user).deliver_later(wait: 1.minute)
end
当我尝试使用 deliver_now 而不是 deliver_later 测试此功能时,它成功了并且邮件被发送了(因此与 Mandrill 的连接正常)。 当我按原样测试这个功能时,作业被添加到邮件队列中。当需要发送电子邮件时,它只是从队列中消失,没有发送电子邮件,也没有在日志中留下任何异常。
我可以看到它出现在 Sidekiq Web 中 UI 然后消失了。
我猜确认邮件是唯一发送的邮件,因为它没有延迟,但我不知道为什么会这样。
在我的暂存环境中一切都运行良好。不同之处在于它与 mailtrap 一起工作并且没有生产那么多的工作。
一些可能相关的代码:
production.rb
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
:user_name => 'xxx',
:password => Rails.application.secrets.smtp_password,
:address => 'smtp.mandrillapp.com',
:domain => config.app_domain,
:port => 'xxx',
:authentication => :login
}
...
config.action_mailer.default_url_options = { :host => config.app_domain, :protocol => 'https' }
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = false
application.rb
config.active_job.queue_adapter = :sidekiq
在没有任何解决方案的情况下浏览了这些链接:
http://guides.rubyonrails.org/active_job_basics.html http://api.rubyonrails.org/classes/ActionMailer/Base.html
没有找到与我的问题相关的任何其他链接。
- 尝试重新部署
- 已尝试重启 Sidekiq
- 已尝试重新启动 Redis
- 尝试重新启动服务器本身
- 尝试从控制台发送电子邮件 - 成功
- 尝试使用 deliver_later 发送电子邮件(等待:1 分钟)- 不成功
我怀疑这与服务器内存不足有关。当我增加服务器上的内存和 postgres 上的 max_connections 参数时,该队列中所有本应发送的电子邮件都立即送达