持久性作业队列?

3
互联网上说使用数据库作为队列是一种反模式,并且您应该使用(RabbitMQ或Beanstalked等)。
但我想要存储所有请求。这样我可以稍后查看它们花了多长时间,是否有失败的尝试、错误或日志记录、谁请求以及其元数据,结果是什么等等。
看起来所有队列的库都没有这个选项。您无法将数据持久化以允许您稍后查询它。
我想要队列所做的事情,但具有“持久到数据库”的选项。这不存在吗?人们如何处理这个问题?当请求结束时,您是否使用队列库并复制所有请求信息到您的数据库中?
(我使用的语言/数据库是任何最适合此问题的)

Redis非常适合这个任务 - 而且速度快。 - Mark Setchell
@MarkSetchell Redis 不太适合存储大量数据(每个请求都是如此,不会删除旧数据)。您也无法很好地查询 Redis(例如显示用户 1 在过去一个月内发出的所有请求)。 - Farzher
你需要多少任务吞吐量? - D-side
@D-side 我不需要很高的吞吐量。我的请求量不是很大,但需要详细了解它们正在做什么、错误处理、注释等方面的信息。 - Farzher
如果你正确构建队列表,它们不是反模式。如果你想存储工作项,它们是一个很好的解决方案。你的头像很搞笑。 - usr
2个回答

2
如果您想记录请求以及有关其持续时间等元数据,则可以这样做-在知道相关结果时将其记录到数据库中,并按预期运行分析查询。
不使用数据库作为临时存储的原因是,在高流量情况下,搜索和锁定未处理的作业,然后在完成时更新或删除它们可能需要大量的工作。如果不从活动表中删除作业,则必须搜索越来越多已完成的作业才能找到尚未完成的作业。

如果我需要向用户显示这些请求的实时进度,包括进度条和注释,该怎么办?您仍然认为使用消息队列并将信息复制到我的数据库而不是直接使用我的数据库来处理队列是有意义的吗? - Farzher
那部分是Redis的工作。 - Alister Bulman

0

可以使用持久化后端(如数据库)来实现任务队列,但问题是它可能无法很好地扩展,并且最好使用经过验证的实现而不是重新发明轮子。这些都是更难解决的问题,最好使用现有的框架。

例如,如果您正在使用Python进行实现,则典型选择是使用带有Redis / RabbitMQ后端的Celary。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接