Rails - 如何防止 Sidekiq 降低服务器速度?

use*_*621 4 ruby ruby-on-rails newsletter sidekiq

我每天早上都会向客户发送一份时事通讯(约 10,000 封电子邮件),有时会发生这种情况:Sidekiq 作业占用了网站(Rails 应用程序)未运行的大量 CPU/内存性能并面临停电。

当我查看 Sidekiq 仪表板时,我发现新闻通讯存在一些问题(可能是无效的电子邮件地址,并且 Sidekiq 反复尝试再次发送?),并且卡住了。

如何防止这种行为并防止重复 Sidekiq 任务(我认为这是突破的问题)?

这是我的代码:

耙子任务:

namespace :mailer do  desc "Carrier blast - morning"
  task :newsletter_morning => [:environment] do                                            
    NewslettertJob.perform_later
  end
end
Run Code Online (Sandbox Code Playgroud)

职位定义:

class NewslettertJob < ApplicationJob
  def perform
    ...
    NewsletterMailer.morning_blast(data).deliver_now
  end
end
Run Code Online (Sandbox Code Playgroud)

NewsletterMailer

class NewsletterMailer < ApplicationMailer
  def morning_blast(data)
    ...
    customers.each do |customer|
      yield customer, nil; next if customer.email.blank?

      begin
        Retryable.retryable( tries: 1, sleep: 30, on: [Net::OpenTimeout, Net::SMTPAuthenticationError, Net::SMTPServerBusy]) do
          send_email(customer.email).deliver
        end
        send_email(customer.email).deliver
      rescue Net::SMTPSyntaxError => e
        error_msg = "Newsletter sending failed on #{Time.now} with: #{e.message}. e.inspect: #{e.inspect}"
        logger.warn error_msg
        yield customer, nil
        next
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我想要实现的是,时事通讯将每天早上发送出去,如果 Rails/Sidekiq 遇到问题,它会简单地自行关闭,因此时事通讯不会影响主网站(其服务器)上的“生命”。

预先感谢您的每一个建议。我现在被这个问题困扰了一段时间。

Mik*_*ham 7

  1. 如果你的机器只有一个核心,Sidekiq 和 puma 就会争夺 CPU。降低 Sidekiq 的并发性,使其使用更少的 CPU,或者使用具有多个内核的机器,或者将 Sidekiq 移动到另一台机器。

  2. 如果 Sidekiq 进程正在使用 100% 的核心,请降低并发设置。Sidekiq 6.0 中的默认值是 10,这是一个很好的默认值,但如果您只是发送电子邮件,则可能会将其提高到 20。如果您希望利用多个内核更快地处理作业,则可以运行多个 Sidekiq 进程。

  • Mike Perham 是 sidekiq 的作者,所以这基本上是您将得到的最专业的答案 (2认同)