Реализация кода Redis «Шаблон: Надежная очередь» - PullRequest
0 голосов
/ 06 февраля 2019

В превосходной документации 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.

Мои вопросы:

  1. Это вообще то, что они имеют в виду в документации?Если нет, можете ли вы предоставить исправление в качестве ответа?
  2. Это кажется еще неполным и не очень надежным.Например, должны ли быть альтернативные списки для ошибок против полных очередей?Один на каждое возможное состояние ошибки?Что произойдет, если ваш Redis выйдет из строя во время обработки?

1 Ответ

0 голосов
/ 18 апреля 2019

Как отмечал @ rainhacker в комментариях , теперь рекомендуется использовать для этого потоки Redis вместо рецепта, описанного в разделе «Шаблон: надежная очередь»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...