【发布时间】:2014-01-07 06:09:06
【问题描述】:
我意识到 sidekiq 有一个 push_bulk 选项,但我目前受到 redis 延迟的限制,因此通过 push_bulk 传递多个项目仍然不够快(只有大约 50/s)。
我尝试像这样增加 redis 连接的数量:
redis_conn = proc {
Redis.new({ :url => Rails.configuration.redis.url })
}
Sidekiq.configure_client do |config|
Sidekiq.configure_client do |config|
config.redis = ConnectionPool.new(size: 50, &redis_conn)
end
config.client_middleware do |chain|
chain.add Sidekiq::Status::ClientMiddleware
end
end
然后启动单独的线程 (Thread.new) 以在各种对象上实际执行异步。有趣的是,任何不是第一个线程的线程都不会被扔到 sidekiq 队列中,就好像它们被完全忽略了一样。
有人知道更好的方法吗?
编辑:这是我尝试的 push_bulk 方法,实际上速度较慢:
user_ids = User.need_scraping.pluck(:id)
bar = ProgressBar.new(user_ids.count)
user_ids.in_groups_of(10000, false).each do |user_id_group|
Sidekiq::Client.push_bulk(
'args' => user_id_group.map{ |user_id| [user_id] },
'class' => ScrapeUser,
'queue' => 'scrape_user',
'retry' => true
)
end
谢谢!
【问题讨论】:
标签: ruby-on-rails redis sidekiq