问题描述
使用Redis流,我们可以处理一些消费者尚未完成的待处理项目。 我可以使用xpending command找到此类物品。 让我们有两个待处理项目:
1) 1) "1-0"
2) "local-dev"
3) (integer) 9599
4) (integer) 1
2) 1) "2-0"
2) "local-dev"
3) (integer) 9599
4) (integer) 1
通过使用xpending
我们只能基于id设置过滤器的问题。我有几个服务节点(A
,B
)进行僵尸检查:XPENDING mystream test_group - 5 1
他们每个人都收到"1-0"
项,他们制作了xclaim
,只有其中一个(例如A
)成为所有者,并开始处理该项。但是B
再次运行xpending
以获取新项目,但由于尚未处理("1-0"
在工作),它再次收到A
,看起来像我所有的队列被阻止。
有什么解决方案可以避免并同时处理待处理的项目吗?
解决方法
您想查看文档,尤其是Recovering from permanent failures。
通常使用的方式是:
- 您允许同一使用者在恢复后使用其从PEL发送的邮件。
- 只有相当长的时间过去后,您才
XCLAIM
来自另一个使用者,这表明原始使用者处于永久性故障中。 - 您使用交货计数来检测毒药或死亡信。如果邮件已重试多次,最好将其报告给管理员进行分析。
因此,通常您所需要的就是从其他消费者那里看到PEL的最老年龄,以进行永久性故障恢复逻辑,并且一一消耗掉。