【发布时间】:2023-03-22 22:35:01
【问题描述】:
优秀的 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.
我的问题是:
- 这通常是他们在文档中的意思吗?如果没有,你能提供一个修复作为答案吗?
- 这似乎仍然不完整,也不是很可靠。例如,是否应该有错误队列和完整队列的替代列表?每个可能的错误状态都有一个?如果您的 Redis 在处理过程中出现故障会怎样?
【问题讨论】:
-
你看过 Redis Streams 吗? redis.io/topics/streams-intro
-
文档中的可靠队列是否被认为已弃用以支持流?
-
是的,您可以在 Salvatore 的 post 中阅读更多内容:“Redis 存在问题,这并没有让我对默认导出的数据结构感到放松。存在某种差距Redis 列表、排序集和 Pub/Sub 功能之间的关系。您可以使用所有这些工具来为一系列消息或事件建模,但需要进行不同的权衡。”