Py学习  »  Redis

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

Mittenchops • 4 年前 • 389 次点击  

优秀的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.

我的问题是:

  1. 这是文档中通常的意思吗?如果没有,你能提供一个解决方案作为答案吗?
  2. 这似乎还不完整,也不太可靠。例如,对于错误队列和完整队列,是否应该有替代列表?每一个可能的错误状态对应一个?如果你的redis在处理过程中掉了怎么办?
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/41000
 
389 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Mittenchops
Reply   •   1 楼
Mittenchops    5 年前

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