我正在创建一个rails应用程序,它会丢弃一些网站的内容。让我们说 - 15家商店及其产品。刮痧是一个无限的过程,一个接一个地废弃每个商店,当最后一个商店报废时,工人回到第一个商店,整个过程从一开始就开始。
我的第一个想法是使用一种递归的sidekiq工人,这会废弃一家商店。 1,成功之后,废弃下一家店铺开火自己
class FetcherWorker
include Sidekiq::Worker
def perform(shop_id)
Shop.find(shop_id).fetch_products
FetcherWorker.perform_async(next_shop_id)
end
end
然而,我完全没有这方面的经验(如此长时间运行的过程)所以我想问你是否有任何最佳实践或任何明显的解决方案,我应该在以下情况下使用?能够访问当前正在进行的信息以及当前正在废弃的商店(并且sidekiq提供此类工具)对我来说非常重要。提前谢谢。
答案 0 :(得分:1)
我会分开执行工作并安排工作。 如果你的工作崩溃,那么它可能不会重新安排自己。还有一个引导问题(让我们说重启)所以你需要以某种方式安排第一份工作。
我可能会在商店模型中添加一个last_scraped_at时间戳,并添加一个范围:up_for_scraping,它可以找到所有未在N分钟内被抓取的商店。
然后,调度程序找到这些商店并将它们排入sidekiq以便执行。调度程序可以像ruby脚本一样简单,由cron启动。
也许你可以把你的工作做好,以便他们不会在同一家商店多次经营?
def perform...
return if runs_or_has_been_running_within_a_short_period_for_this_shop?
...
...
end
这应该有助于不会堆积比工作池可以处理的工作更多的工作。排队的作业数量应该随着时间的推移保持不变。如果它堆积起来:要么你的抓取代码不够高,你没有足够的演员,刮削频率很高,或硬件不够。如果它是空的那么你可以更频繁地刮擦。