【问题标题】:Persistent job queue?持久作业队列?
【发布时间】:2015-11-21 00:47:10
【问题描述】:

互联网说将数据库用于队列是一种反模式,您应该使用(RabbitMQ 或 Beanstalked 等)

但我希望存储所有请求。所以我可以稍后查找他们花了多长时间,任何失败的尝试或错误或记录的注释,谁请求它以及使用什么元数据,最终结果是什么等。

看起来所有队列库都没有这个选项。您不能将数据持久化以允许您以后查询。

我想要这些队列的功能,但带有“持久化到数据库”选项。这不存在吗?人们如何处理这个问题?您是否使用队列库并在请求完成时将所有请求信息复制到数据库中?

(我使用的语言/数据库是任何东西,只要最适合这个)

【问题讨论】:

  • Redis 在这方面非常出色——而且速度很快。
  • @MarkSetchell redis 不能很好地存储大量数据(每一个请求,而不是删除旧请求)。你也根本不能很好地查询redis(显示用户1在过去一个月里提出的所有请求)
  • 您需要多少任务吞吐量?
  • @D-side 我不需要大量的吞吐量。我的请求数量很少,但需要详细说明他们在做什么、错误处理、注释等
  • 如果您正确构建队列表,它们就不是反模式。如果您想存储工作项目,它们是一个很好的解决方案。你的头像很搞笑。

标签: database message-queue priority-queue task-queue


【解决方案1】:

如果您想要记录请求以及有关请求所用时间等的元数据,那么请执行此操作 - 在您知道相关结果后将其记录到数据库中,然后按照您的预期运行分析查询。

不将数据库用作临时存储的原因是,在高流量下,搜索和锁定未处理的作业,然后在它们完成时更新或删除它们,可能会花费大量精力。如果不从活动表中删除作业,则尤其如此,因此必须搜索更多已完成的作业以找到尚未完成的作业。

【讨论】:

  • 如果我需要向用户显示这些请求的实时进度怎么办。包括进度条和注释。您仍然认为使用消息队列并将信息复制到我的数据库而不是直接使用我的数据库作为队列有意义吗?
  • 那部分是 Redis 的工作
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-03-11
    • 2011-02-21
    • 2023-04-05
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2018-01-09
    相关资源
    最近更新 更多