1

在我的应用程序中,我需要处理上传的文档并将处理结果放入数据库中。
文档存储在文件系统中,元数据存储在数据库中。
对于每个文档,需要从磁盘打开和处理文件,然后相应地更新数据库中的元数据。处理可能很昂贵并且需要很长时间。
我打算做的是:

  1. Span N 个任务,一个任务处理单个文档
  2. 每个任务都会去寻找最旧的、“未处理”的文档
  3. 任务将在数据库中将其标记为“进行中”并开始处理它
  4. 处理文档后任务将更新元数据并将其在数据库中标记为“已处理”
  5. 之后任务将进入第 2 步

假设应用程序是用Java而不是Scala编写的,那么利用Play和Akka实现这个的正确/最简单的方法是什么?源代码示例也将不胜感激。

4

1 回答 1

1

正确的做法是“不要在 Play 应用中运行任何后台任务”。Play 是一个用于编写 Web 应用程序的 Web 框架,而后台任务,顾名思义,不使用 Web 界面。所以设置一个单独的后台任务运行器并通过 Akka 向它发送消息/事件。事实上,如果您将尽可能多的业务逻辑推送到后台任务中,您将拥有一个更具可扩展性的应用程序。

有关该模型的逻辑结论示例,请查看 Mongrel2 Web 服务器http://mongrel2.org/manual/book-final.html

鉴于我们在 JVM 世界中拥有像 Akka 和 Camel 这样的工具,并且像 Play 这样的框架正在让我们摆脱 servlet 架构,我认为是时候效仿 Mongrel2 并回到更多的 3 层架构,其中 Web应用层只做最少的工作。

如果您遵循此架构,您会将运行后台任务所需的所有信息捆绑到一条消息中,将其发送给执行工作的外部参与者,然后可能让该参与者向另一个参与者发送完成消息,该参与者将更新数据库。

于 2013-05-04T22:42:48.563 回答