В превосходной документации redis перечислены Шаблон надежной очереди в качестве хорошего кандидата / примера для функции RPOPLPUSH.
Я понимаю, что "надежная очередь" - это нечто с шаблонами доставки, такими как Amazon SQS FIFO шаблон один раз .
В частности, у вас есть N процессов, поступающих в очередь, и несколько M работников, работающих из очереди.Как это на самом деле выглядит как реализация?
Я бы рискнул что-то вроде:
Сделать процесс подачи заполнением рабочей очереди.
# feeder1
import redis
import datetime
import time
r = redis.Redis(host='localhost', port=6379, db=0)
while True:
now = datetime.datetime.now()
value_to_work_on = "f1:{}".format(now.second)
r.push('workqueue', value_to_work_on)
time.sleep(1)
Сделать еще один
# f2
import redis
import datetime
import time
r = redis.Redis(host='localhost', port=6379, db=0)
while True:
now = datetime.datetime.now()
value_to_work_on = "f2:{}".format(now.second)
r.push('workqueue', value_to_work_on)
time.sleep(1)
Теперь сделайте рабочих
# worker1
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
def do_work(x):
print(x)
return True
while True:
todo = r.rpoplpush("workqueue" "donequeue")
if do_work(todo):
print("success")
else:
r.push("workqueue", todo)
# worker2 is exactly the same, just running elsewhere.
Мои вопросы:
- Это вообще то, что они имеют в виду в документации?Если нет, можете ли вы предоставить исправление в качестве ответа?
- Это кажется еще неполным и не очень надежным.Например, должны ли быть альтернативные списки для ошибок против полных очередей?Один на каждое возможное состояние ошибки?Что произойдет, если ваш Redis выйдет из строя во время обработки?