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

Workflow 如何实现基于队列的工作流系统?,workflow,architecture,Workflow,Architecture,我正在开发一个文档管理系统。工作流示例如下所示: 文档通过电子邮件发送到系统 该系统对该文件进行了许多准备工作 文档将呈现给用户以供进一步处理 然后,将文件发送给质量保证部 之后,系统对文档执行编号或后处理操作 文件被视为已完全处理和分发(例如,通过电子邮件发送给向系统发送文件的人等) 由于我的输入量会有所不同(但通常会很大),因此我非常担心可伸缩性 例如,假设系统已经下载了电子邮件附件。如果附件是PDF文档,系统需要将PDF拆分为单独的页面,然后将每个页面转换为多个大小的缩略图,等等。我计划进

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

  • 文档通过电子邮件发送到系统
  • 该系统对该文件进行了许多准备工作
  • 文档将呈现给用户以供进一步处理
  • 然后,将文件发送给质量保证部
  • 之后,系统对文档执行编号或后处理操作
  • 文件被视为已完全处理和分发(例如,通过电子邮件发送给向系统发送文件的人等)
  • 由于我的输入量会有所不同(但通常会很大),因此我非常担心可伸缩性

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

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

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

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

  • 准备好处理PDF文档了吗
  • 当前正在处理的PDF文档
  • PDF处理完成
  • 同样适用于质量保证:

  • 准备好质量保证文件
  • 文件目前正在QAd中
  • 完成文件质量保证
  • 这是一个好方法吗?有更好的方法吗?我是否将这些标志作为数据库中“PDF文档”表的一列?或者标志应该是它自己的表(例如,特别是当文档可以设置多个标志时)


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

    解决方案的种类取决于您使用什么技术来实现此系统。预处理/后处理是否由与电子邮件软件相同的软件/语言完成?此外,它们运行在不同的进程中

    如果您有分布式组件,您可能会比研究AMQP解决方案(如)做得更糟,因为这需要将每个作业放入队列,并确保每个作业只有一个使用者参与。(我们将每个缩略图工作建模为单个任务)

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

    • 是Ruby的一个很好的解决方案
    • Java可以很好地作为
    • 呃,我相信c#会有办法创建一个工作队列(免责声明:我对c#一无所知)

    为了解决您对同一文档上并发处理的担忧,您可以使用许多计划程序包来帮助您管理此方面。这是一个我用得很成功的方法

    为了解决您的问题,我将有3种状态,接收、排队、处理(与您建议的类似)

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

    Quartz使用一个线程池,带有可能的配置选项,非常适合延迟的、资源密集型的处理(我在服务器设置中用于图像缩略图)

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


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

    似乎你应该建立一个有多个消费者的排队系统。你想在那上面指点一下吗?当然。我对所有想法都持开放态度。我正在WAMP/LAMP上实现,但更多的是寻找一种技术无关的解决方案。因此,在这种情况下,RabbitMQ仍然应该是您的一个选项,因为AMQP是系统无关的(它的设计允许不同的技术以统一的方式相互通信)。或者在Zend Server中有一个特定的PHP队列实现(我认为这要花很多钱),或者有一个用于Resque的库,它可以插入PHP代码