रेडिस में एक साधारण कतार का एहसास करने के लिए जिसका उपयोग दुर्घटनाग्रस्त नौकरियों को फिर से जमा करने के लिए किया जा सकता है, मैं कुछ इस तरह की कोशिश करूंगा:
- 1 सूची "up_for_grabs"
- 1 सूची "being_worked_on"
- स्वतः समाप्त होने वाले ताले
नौकरी हथियाने की कोशिश कर रहा एक कर्मचारी कुछ इस तरह करेगा:
timeout = 3600
#wrap this in a transaction so our cleanup wont kill the task
#Move the job away from the queue so nobody else tries to claim it
job = RPOPLPUSH(up_for_grabs, being_worked_on)
#Set a lock and expire it, the value tells us when that job will time out. This can be arbitrary though
SETEX('lock:' + job, Time.now + timeout, timeout)
#our application logic
do_work(job)
#Remove the finished item from the queue.
LREM being_worked_on -1 job
#Delete the item's lock. If it crashes here, the expire will take care of it
DEL('lock:' + job)
और समय-समय पर, हम बस अपनी सूची ले सकते हैं और जांच सकते हैं कि वहां मौजूद सभी नौकरियों में वास्तव में ताला लगा है। अगर हमें कोई ऐसी नौकरी मिलती है जिसमें ताला नहीं है, तो इसका मतलब है कि यह समाप्त हो गया है और हमारा कार्यकर्ता शायद दुर्घटनाग्रस्त हो गया है। यह मामला हम फिर से सबमिट करेंगे।
यह उसके लिए छद्म कोड होगा:
loop do
items = LRANGE(being_worked_on, 0, -1)
items.each do |job|
if !(EXISTS("lock:" + job))
puts "We found a job that didn't have a lock, resubmitting"
LREM being_worked_on -1 job
LPUSH(up_for_grabs, job)
end
end
sleep 60
end