优秀的redis文档列出了
Reliable queue pattern
作为rpoplPush函数的一个好的候选/示例。
我理解“可靠队列”是具有如下交付模式的
Amazon SQS FIFO exactly once pattern
.
具体来说,有一些n个进程进入队列,还有一些m个工作线程从队列工作。这实际上是一个什么样的实现?
我敢说:
使feeder进程填充工作队列。
# 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在处理过程中掉了怎么办?