繁体   English   中英

Roku任务在Heroku上超时-使用Sidekiq将Rake任务移至工作人员

[英]Rake Task timing out on Heroku - Move Rake task to worker using Sidekiq

我最近意识到,我的耙子任务可能会在Heroku上超时,而我碰巧有很多。

这是我的瑞克任务的一个示例:

namespace :test do

  desc "Test Rake Task"
  task get_list: :environment do
    require 'net/ftp'
    sftp = Net::SFTP.start('ftp.test.com','luigi', :password => 'pass_word')
    records = sftp.download!("luigi/list.xml")
    records_hash = Hash.from_xml(records)
    records_hash['Report']['Details'].each do |record|
      contact = Contact.create(              
          first_name: record['FirstName'],
          last_name: record['LastName'],
          date_of_birth: record['DateofBirth']
      )
      if contact.valid?
        puts "Created contact"
      else
        puts "Invalid contact"
      end
    end    
  end
end

认为我需要将其移交给后台工作者。 完成此任务并将每个联系人添加到数据库可能需要5分钟以上的时间。 我想使用Sidekiq ,但是我从未使用过“ workers”或进行过设置。

通常,我将如何设置Sidekiq使其在Heroku上运行,然后将上述任务移交给后台工作人员? 我希望这个“工人”或“任务”计划每周一次,星期一上午8点安排。

我的应用程序设置:

Procfile:

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb

我正在使用Postgres数据库,Rails 4.0.0,ruby 2.0.0,并且正如我之前提到的,我的应用程序托管在Heroku上。

您应该遵循Sidekiq文档并为Heroku进行设置。

您正在运行Sidekiq的一种,我建议使用以下体系结构:

  • ContactListWorker :下载列表,为每个列表排队一个联系人更新作业
  • ContactWorker :提供详细信息,创建/更新联系人
  • 耙任务contacts:nightly_update将ContactListWorker作业排队

这是一些粗略的伪代码,以显示该体系结构可能是什么样的:

# rake contact:nightly_sync_list
namespace :contacts do
  desc "Test Rake Task"
  nightly_list_sync: :environment do
    ContactListWorker.perform_async
  end
end

class ContactListWorker
  require 'net/ftp'
  include Sidekiq::Worker

  def perform()
    sftp = Net::SFTP.start('ftp.test.com','luigi', :password => 'pass_word')
    records = sftp.download!("luigi/list.xml")
    records_hash = Hash.from_xml(records)
    records_hash['Report']['Details'].each {|record| ContactWorker.perform_async(record) }
  end
end

class ContactWorker
  include Sidekiq::Worker

  def perform(record)
    contact = Contact.create(
      first_name: record['FirstName'],
      last_name: record['LastName'],
      date_of_birth: record['DateofBirth']
    )
    if contact.valid?
      puts "Created contact"
    else
      puts "Invalid contact"
    end
 end

结束

这种体系结构允许您异步启动一个后台ContactListWorker作业。 该作业将完成下载并迅速使N ContactWorker作业ContactWorker队。 这使您可以在多个Sidekiq工作器和线程之间展开处理,以分发处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM