簡體   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