在 Rails 中使用带有 运行 动态计数器的 sidekiq
Use sidekiq with a running dynamic counter in Rails
我构建了一个网站爬虫,(稍后)使用这些链接读取信息。
当前的 rake-task 一页一页地检查所有可能的页面,并检查请求是否通过(有效响应)或 returns 404/503 错误(无效页面)。如果有效,页面 url 将保存到我的数据库中。
现在您可以看到该任务总共请求 50,000 页,因此需要一些时间。
我已经了解了 Sidekiq 以及它如何异步执行这些任务从而使速度更快。
我的问题:如您所见,我的任务在每次循环后构建计数器。我猜这不适用于 Sidekiq,因为它只会多次独立于自身执行此脚本,对吗?
我该如何解决每个实例都需要自己的计数器的问题?
希望我的问题有道理 - 非常感谢!
desc "Validate Pages"
task validate_url: :environment do
require 'rubygems'
require 'open-uri'
require 'nokogiri'
counter = 1
base_url = "http://example.net/file"
until counter > 50000 do
begin
url = "#{base_url}_#{counter}/"
open(url)
page = Page.new
page.url = url
page.save!
puts "Saved #{url} !"
counter += 1
rescue OpenURI::HTTPError => ex
logger ||= Logger.new("validations.log")
if ex.io.status[0] == "503"
logger.info "#{ex} @ #{counter}"
end
puts "#{ex} @ #{counter}"
counter += 1
rescue SocketError => ex
logger ||= Logger.new("validations.log")
logger.info "#{ex} @ #{counter}"
puts "#{ex} @ #{counter}"
counter += 1
end
end
end
如果您想异步使用它 - 这意味着您将有许多相同作业的实例。最快的方法 - 使用类似 redis
的方法。这将为您提供简单快捷的方法来 check\update 满足您的需求。但也要确保你关心计数器:如果你的一个工作使用它,将它锁定用于其他工作,所以不会有错误的结果等
一个简单的 Redis INCR
操作将创建 and/or 增量全局计数器供您的作业使用。你可以使用 Sidekiq 的 redis 连接来简单地实现一个计数器:
Sidekiq.redis do |conn|
conn.incr("my-counter")
end
我构建了一个网站爬虫,(稍后)使用这些链接读取信息。
当前的 rake-task 一页一页地检查所有可能的页面,并检查请求是否通过(有效响应)或 returns 404/503 错误(无效页面)。如果有效,页面 url 将保存到我的数据库中。 现在您可以看到该任务总共请求 50,000 页,因此需要一些时间。
我已经了解了 Sidekiq 以及它如何异步执行这些任务从而使速度更快。
我的问题:如您所见,我的任务在每次循环后构建计数器。我猜这不适用于 Sidekiq,因为它只会多次独立于自身执行此脚本,对吗?
我该如何解决每个实例都需要自己的计数器的问题?
希望我的问题有道理 - 非常感谢!
desc "Validate Pages"
task validate_url: :environment do
require 'rubygems'
require 'open-uri'
require 'nokogiri'
counter = 1
base_url = "http://example.net/file"
until counter > 50000 do
begin
url = "#{base_url}_#{counter}/"
open(url)
page = Page.new
page.url = url
page.save!
puts "Saved #{url} !"
counter += 1
rescue OpenURI::HTTPError => ex
logger ||= Logger.new("validations.log")
if ex.io.status[0] == "503"
logger.info "#{ex} @ #{counter}"
end
puts "#{ex} @ #{counter}"
counter += 1
rescue SocketError => ex
logger ||= Logger.new("validations.log")
logger.info "#{ex} @ #{counter}"
puts "#{ex} @ #{counter}"
counter += 1
end
end
end
如果您想异步使用它 - 这意味着您将有许多相同作业的实例。最快的方法 - 使用类似 redis
的方法。这将为您提供简单快捷的方法来 check\update 满足您的需求。但也要确保你关心计数器:如果你的一个工作使用它,将它锁定用于其他工作,所以不会有错误的结果等
一个简单的 Redis INCR
操作将创建 and/or 增量全局计数器供您的作业使用。你可以使用 Sidekiq 的 redis 连接来简单地实现一个计数器:
Sidekiq.redis do |conn|
conn.incr("my-counter")
end