Redis“模式:可靠队列”的代码实现

时间:2019-02-06 20:36:39

标签: redis queue

优秀的Redis文档列出了Reliable queue pattern作为RPOPLPUSH函数的很好的候选者/示例。

我了解“可靠的队列”是指具有Amazon SQS FIFO exactly once pattern之类的投放模式。

具体来说,您有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 :(得分:0)

作为@rainhacker pointed out in comments,现在建议为此使用Redis流,而不是“模式:可靠队列”中所述的方法