Rails-如何防止Sidekiq减慢服务器速度?

问题描述 投票:0回答:1

[我有一个通讯,每天早晨发送给我的客户(约1万封电子邮件),有时发生的是,此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工作占用了网站(Rails应用程序)所需要的CPU /内存性能……]]] >>

我认为,理想情况下,您应该将后台任务服务器与Web服务器分开,这样后台进程就不会影响Web服务器的性能。我在一家人流量/高负载的公司工作,我们这里有各种架构。

此答案中有关于如何停止重试的说明:Disable automatic retry with ActiveJob, used with Sidekiq

另一件事,您的电子邮件发送同步完成(.deliver)。这暗示着您的任务是一个庞大的单轨交易流程,涉及许多客户。相反,您可以使用delivery_later,这样每个客户都会得到它自己的小工人。这也将有助于减轻CPU和内存的使用。您甚至可以创建一个工作人员来为每个客户发送电子邮件,并使用单身的Job仅仅发送这些电子邮件。

但是,我认为灵丹妙药正在将您的sidekiq服务器与Web服务器分开-具有一台专用于后台任务的服务器。在您的Web服务器上,您甚至没有启动sidekiq实例。

ruby-on-rails ruby sidekiq newsletter
1个回答
0
投票

我认为,理想情况下,您应该将后台任务服务器与Web服务器分开,这样后台进程就不会影响Web服务器的性能。我在一家人流量/高负载的公司工作,我们这里有各种架构。

此答案中有关于如何停止重试的说明:Disable automatic retry with ActiveJob, used with Sidekiq

© www.soinside.com 2019 - 2024. All rights reserved.