Вопрос архитектуры - Куда поставить задачу по очистке - PullRequest
0 голосов
/ 02 апреля 2019

В настоящее время я создаю приложение, которое будет просто посещать веб-сайт каждый день и сохранять информацию о конкретной таблице этого сайта в базу данных, которую я настроил.В настоящее время я создал метод класса на моей модели, чтобы завершить очистку.Созданная мною рейк-задача вызывает метод класса один раз в день.

Хотя мой код «работает» и я собираю информацию один раз в день, я чувствую себя несколько странно, оставляя логику для очистки в моей модели, и яЛюбопытно, есть ли предпочтительный способ выполнить эту задачу.

class WebTable < ApplicationRecord


    def self.scrape_and_save_table_information
        doc = Nokogiri::HTML(open('https://www.calottery.com/play/scratchers-games/top-prizes-remaining'))
        rows = doc.css("tbody tr")
        rows.each do |row|
            row_object = {}
            row_object["cell_one"] = row.children[1].children[0].to_s
            row_object["cell_two"] = row.children[2].children[0].children.to_s
            row_object["cell_three"] = row.children[7].children[0].children[0].to_s
            @table = WebTable.create(row_object)

        end
    end

end

Моя задача по рейку выглядит следующим образом:

desc 'scraping webpages'
task scrape_web_pages: :environment do
    daily_prize_scrape = WebTable.scrape_and_save_table_information
end

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Работники Sidekiq, как правило, работают достаточно хорошо (рассчитан на каламбур), и, в частности, в случае петель вы можете порождать других работников от одного основного работника, чтобы повысить производительность и упростить поиск ошибок

, например.

class HardWorker
  include Sidekiq::Worker

  ['nice', 'rows'].each do |row|
    OtherWorker.perform_async(row)
  end
end
0 голосов
/ 02 апреля 2019

Лучше сделать это заданием ActiveJob, даже если вы будете называть его без каких-либо фоновых работников, просто набрав YourTask.perform_now из rails runner.

Это позволит вам отделить логику,также активные задания легче тестировать, чем рейковые задачи.

...