Sidekiq 作业已安排,没有运行,只是消失了

Posted

技术标签:

【中文标题】Sidekiq 作业已安排,没有运行,只是消失了【英文标题】:Sidekiq job is scheduled, not running and just disappears 【发布时间】:2016-12-06 21:05:57 【问题描述】:

我正在开发一个使用 Sidekiq 和 Mandrill 在后台发送电子邮件的 Rails 应用程序。 在我的应用程序中,我有 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,并且没有生产那么多的工作。

一些可能相关的代码:

生产.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

应用程序.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(wait:1min) 发送电子邮件 - 不成功

【问题讨论】:

我今天遇到了类似的问题,我不确定这是否有帮助,但您是否尝试过使用此命令启动服务器? `bundle exec sidekiq -q default -q mailers' github.com/mperham/sidekiq/wiki/Active-Job#action-mailer @sirramongabriel 是的 你找出这个问题的根源了吗?我遇到了一个非常相似的问题。 不幸的是没有,但我怀疑这与服务器内存不足有关。当我增加内存时,该队列中应该发送的所有电子邮件都立即发送了......希望我早点知道。 【参考方案1】:

我怀疑这与服务器内存不足有关。当我增加服务器上的内存和 postgres 上的 max_connections 参数时,该队列上应该发送的所有电子邮件都会立即发送

【讨论】:

以上是关于Sidekiq 作业已安排,没有运行,只是消失了的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 sidekiq 计划的 cron 作业没有在 heroku 上运行?

Sidekiq 停止一项正在运行的作业

使用 java 工具的类似 Sidekiq 的队列?

如何使用 Sidekiq 运行连续的后台作业?

Rspec 如何测试 Sidekiq 作业是不是计划在特定时间运行

如何确保 Sidekiq 后台作业针对它们启动的同一数据库运行