【发布时间】:2020-07-01 17:44:41
【问题描述】:
我每天早上都会向客户发送一份简报(大约 1 万封电子邮件),有时会发生这种 Sidekiq 作业占用大量 CPU/内存性能,而网站(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 遇到问题,它会简单地自行关闭,因此时事通讯不会影响主网站上的“生活”(它的服务器)。
提前感谢您的每一个建议。我在这个问题上被困了一段时间。
【问题讨论】:
标签: ruby-on-rails ruby sidekiq newsletter