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

标签 ruby-on-rails ruby sidekiq newsletter

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

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

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

这是我的代码:

rake 任务:

namespace :mailer do  desc "Carrier blast - morning"
  task :newsletter_morning => [:environment] do                                            
    NewslettertJob.perform_later
  end
end

工作定义:

class NewslettertJob < ApplicationJob
  def perform
    ...
    NewsletterMailer.morning_blast(data).deliver_now
  end
end

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

我想要实现的是每天早上都会发送时事通讯,如果 Rails/Sidekiq 遇到问题,它会自行关闭,所以时事通讯不会影响主网站上的“生活”(它的服务器)。

提前感谢您的每一个建议。我在这个问题上被困了一段时间。

最佳答案

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

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

关于ruby-on-rails - Rails - 如何防止 Sidekiq 降低服务器速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60776681/

相关文章:

ruby-on-rails - 使用 cronjob 定期重新启动 sidekiq

ruby-on-rails - rails active_storage :install IS NOT WORKING

ruby-on-rails - gsub { $1.upcase} ?相当于.capitalize?

ruby-on-rails - 将 rails 限制为仅响应 JSON 和 XML 请求

ruby-on-rails - 使用文本文件构建页面 (Rails 2.3)

ruby - Ruby 方法如何发回不同数量的变量?

ruby-on-rails - rails/Sidekiq : Help me understand the duplication in this example of `initializers/sidekiq.rb`

ruby-on-rails - 尝试发送电子邮件时出现 sidekiq_mailer 错误

ruby-on-rails - Ruby Rails 中的 Heisenbug 错误

ruby-on-rails - haml 添加样式到表单元素