我认为,理想情况下,您应该将后台任务服务器与Web服务器分开,这样后台进程就不会影响Web服务器的性能。我在一家人流量/高负载的公司工作,我们这里有各种架构。
此答案中有关于如何停止重试的说明:Disable automatic retry with ActiveJob, used with Sidekiq
[我有一个通讯,每天早晨发送给我的客户(约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实例。
我认为,理想情况下,您应该将后台任务服务器与Web服务器分开,这样后台进程就不会影响Web服务器的性能。我在一家人流量/高负载的公司工作,我们这里有各种架构。
此答案中有关于如何停止重试的说明:Disable automatic retry with ActiveJob, used with Sidekiq