首页 > 解决方案 > Redis“模式:可靠队列”的代码实现

问题描述

优秀的 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 在处理过程中出现故障会发生什么?

标签: redisqueue

解决方案


正如@rainhacker 在评论中指出的那样,现在建议为此使用 Redis Streams 而不是“模式:可靠队列”中描述的配方


推荐阅读