sql >> Databáze >  >> NoSQL >> Redis

Platnost fronty Redis s nárokem vyprší

Chcete-li realizovat jednoduchou frontu v redis, kterou lze použít k opětovnému odeslání zhroucených úloh, zkusil bych něco takového:

  • 1 seznam „up_for_grabs“
  • 1 seznam „being_worked_on“
  • automaticky končící zámky

pracovník, který se snaží získat práci, by udělal něco takového:

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)

A tu a tam bychom mohli jen popadnout náš seznam a zkontrolovat, že všechny úlohy, které tam jsou, mají skutečně zámek. Pokud najdeme nějaké zakázky, které NEMAJÍ zámek, znamená to, že jejich platnost vypršela a náš pracovník pravděpodobně havaroval. tento případ bychom odeslali znovu.

Toto by byl pseudo kód:

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


  1. Řešení pomalých dotazů v MongoDB

  2. Bezplatné nasazení a monitorování databáze s otevřeným zdrojovým kódem s ClusterControl Community Edition

  3. Možnosti fulltextového vyhledávání pro nastavení MongoDB

  4. Vytváření vícepolních indexů v Mongoose / MongoDB