我每天早上都会向客户发送一份时事通讯(约 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 遇到问题,它会自行关闭,所以时事通讯不会影响主网站上的“生活”(它的服务器)。
提前感谢您的每一个建议。我在这个问题上被困了一段时间。
最佳答案
如果你的机器只有一个核心,Sidekiq 和 puma 会争夺 CPU。降低 Sidekiq 的并发性,使其使用更少的 CPU,或者获得一台多核机器,或者将 Sidekiq 移至另一台机器。
如果 Sidekiq 进程正在使用 100% 的核心,请降低并发设置。 Sidekiq 6.0 中的默认值是 10,这是一个很好的默认值,但如果您只是发送电子邮件,您可能会将其提高到 20。如果您希望利用多个内核来更快地处理作业,则可以运行多个 Sidekiq 进程。
关于ruby-on-rails - Rails - 如何防止 Sidekiq 降低服务器速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60776681/