У меня есть информационный бюллетень, который я рассылаю своим клиентам (~ 10 тыс. Электронных писем) каждое утро, и иногда случается, что это задание Sidekiq требует некоторой производительности ЦП / памяти, что веб-сайт (приложение Rails) не работает и сталкивается с отключениями.
Когда я смотрю на панель управления Sidekiq, я вижу, что есть какая-то проблема (возможно, неверный адрес электронной почты и Sidekiq неоднократно пытается отправить его снова?) С информационным бюллетенем, и он застрял.
Как сделать Я предотвращаю такое поведение и не позволяю повторять задачу Sidekiq (которая, как мне кажется, является проблемой прорыва)?
Вот мой код:
задача рейка:
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 столкнется с проблемой, он просто отключится, поэтому информационный бюллетень не повлияет на «жизнь» на главном веб-сайте (его сервере).
Заранее благодарим вас за каждый совет. Я застрял в этом вопросе на некоторое время.