【问题标题】:How to Implement Queue Based Workflow System?如何实现基于队列的工作流系统?
【发布时间】:2015-10-22 02:36:11
【问题描述】:

我正在开发一个文档管理系统。示例工作流程如下所示:

  1. 文档通过电子邮件发送到系统
  2. 系统对文档做了一些准备工作
  3. 文档已提交给用户以供进一步处理
  4. 然后,将文档发送给质量保证部
  5. 之后,系统会对文档执行一些或后处理操作
  6. 文档被认为是完全处理和传播的(例如,通过电子邮件将文档发送回系统,等等)

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

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

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

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

因此,工作流程中的每个步骤可能会有 3 个标志:

  1. 准备处理的 PDF 文档
  2. PDF 文档正在处理中
  3. PDF 处理完成

QA 也一样:

  1. 为 QA 准备的文档
  2. 文档当前正在 QAd 中
  3. 文档质量检查完成

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

我想就如何实施这样的系统征求建议。

【问题讨论】:

  • 看来你应该设置一个有多个消费者的排队系统。你想要这方面的指针吗?
  • 当然。我对所有想法持开放态度。

标签: workflow architecture


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    解决方案类型取决于您用于实现该系统的技术是由与电子邮件软件相同的软件/语言完成的前/后处理吗?此外,它们是否在单独的进程中运行。

    如果你有分布式组件,你可能会比调查像RabbitMQ 这样的 AMQP 解决方案做得更糟,因为这需要将每个作业放入队列中,并确保只有一个消费者负责每个作业。 (我们将每个缩略图作业建模为单独的任务)。

    但是,如果整个系统是用一种语言实现的,并且在单个进程中,您可以使用一些更简单的系统:

    • Resque 是 Ruby 的一个很好的解决方案
    • Java 可以很好地作为LinkedBlockingQueue
    • 嗯,我确信 c# 将有一些方法来创建作业队列(免责声明:我对 c# 一无所知)

    【讨论】:

    • 我正在 WAMP/LAMP 上实施,但更多的是寻找与技术无关的解决方案。
    • 所以在这种情况下,RabbitMQ 应该仍然是您的选择,因为 AMQP 与系统无关(它旨在允许不同的技术以统一的方式相互通信)。或者,在 Zend Server 中有一个特定的 PHP 队列实现(我认为这要花很多钱),或者有这个用于 Resque 的库 github.com/chrisboulton/php-resque 插入 PHP 代码
    猜你喜欢
    • 2023-03-10
    • 2014-08-19
    • 2012-04-19
    • 2012-04-30
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多