gpt4 book ai didi

workflow - 如何实现基于队列的工作流系统?

转载 作者:行者123 更新时间:2023-12-01 04:17:36 25 4
gpt4 key购买 nike

我正在研究文档管理系统。一个示例工作流将是这样的:

  • 文档通过电子邮件发送到系统
  • 系统对文档
  • 做了一些准备 Action
  • 文档呈现给用户以供进一步处理
  • 之后,文件被发送到质量保证
  • 之后,系统对文档
  • 进行编号或后处理操作。
  • 文档被视为已完全处理和传播(例如,通过电子邮件发送给将文档通过电子邮件发送到系统的人等)

  • 由于我的输入量会有所不同(但通常会很大),我非常关心可扩展性。

    例如,假设系统已经下载了电子邮件附件。如果附件是PDF文档,系统需要将PDF拆分成单独的页面,然后将每个页面转换成多个大小的缩略图等。我打算做一个cron作业检查(比如每分钟)看看是否有PDF需要处理的文件。使用标记系统(例如“准备处理的 PDF 文档”),我可以检查数据库中所有标记为要处理的 PDF 文档。 PDF 处理完成后,该标志可以更新为“PDF 处理完成”。

    但是,由于处理每个 PDF 文档非常耗时,我担心在执行下一个 cron 作业时,该 cron 作业也会尝试处理前一个 cron 作业仍在处理的 PDF。

    一种可能的解决方案是立即将 PDF 文档标记为“当前正在处理的 PDF 文档”。这样,当执行下一个 cron 作业时,它将排除已经处理的那些。

    因此,工作流程中的每个步骤可能都有 3 个标志:
  • 准备处理的 PDF 文档
  • 当前正在处理的 PDF 文档
  • PDF 处理完成

  • 质量保证相同:
  • 文档准备好进行 QA
  • 当前为 QAd 的文档
  • 文档 QA 完成

  • 这是一个好方法吗?有没有更好的方法?我会将这些标志作为数据库中“PDF 文档”表的单列吗?或者标志应该是它自己的表(例如,特别是如果一个文档可以设置多个标志)。

    我想征求关于如何实现这样一个系统的建议。

    最佳答案

    为了解决您对同一文档并发处理的担忧,您可以使用许多调度程序包来帮助您管理这方面。 http://www.quartz-scheduler.org/是我使用的非常成功的一个。

    为了解决您的问题,我有 3 个状态,已接收、已排队、已处理(类似于您的建议)。

    我有一个计划的重复性作业,它轮询数据库,查找收到的 pdf,并为每个作业排队一个作业以处理并将 pdf 标记为排队。如果您确保这发生在同一个事务中,并使用乐观锁定,则不会有其他作业出现并重新读取收到的内容的风险。

    Quartz 使用具有多种配置选项的线程池,非常适合延迟、资源密集型处理(我将它用于服务器设置中的图像缩略图)。

    退一步说,Java 世界中有一些很棒的工作流包,它们可以处理您想做的大部分事情,包括延迟的 pdf 处理。看看 jbpm 或 drools flow,这是两个很棒的包,虽然很复杂。

    更新: Drools Flow 已合并到 JBPM 中。对于这个特殊问题,它可能有点“用火箭筒杀死蚊子”的情况,但它是一个很棒的工作流程包。

    关于workflow - 如何实现基于队列的工作流系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3145141/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com