我们有一个守护进程,它扫描表中的脏位,然后将脏行分批调度到delayed_job。为了避免常量的select from data where dirty = 1,我们设置了一个memcached屏障,它包装了表扫描,比如
loop do # daemon
until Rails.cache.fetch("have_dirty_rows") do end
page = 1
loop do # paginate dirty rows
dirty_batch = paginate(#:select => "*",
:order => "id",
:per_page => DIRTY_GET_BATCH_SIZE,
:conditions => {:dirty => 1},
:page => page)
if dirty_batch.empty?
Rails.cache.write("have_dirty_rows",false)
break
end
...
page = page.next
end
end除非我添加一些sleep 0.0001或类似的东西,否则循环仍然会消耗100%的CPU。Ruby/Rails中有没有一种有效的机制可以阻塞像memcached值这样的东西,或者我们可以从memcached值馈送它,这样它就不会一直轮询了?
发布于 2011-07-17 03:34:07
活动轮询是错误的!这些脏东西是从哪里来的?如果这个进程使用消息队列机制(例如RabbitMQ )来通知其他进程,那会更好。数据库中的某些东西发生了变化。
https://stackoverflow.com/questions/6714954
复制相似问题