我应该如何使用作业队列[和Perl / Catalyst]来最好地构建我的Web应用程序?

时间:2009-10-25 22:20:46

标签: perl architecture catalyst web-applications job-queue

我正在使用Catalyst framework编写Web应用程序。我还使用了一个名为TheSchwartz的作业队列。

我想要使用一个作业队列,因为我希望尽可能多的特定于应用程序的代码与Web应用程序接口代码分离。

基本上整个系统由三个主要部分组成:

  • GUI(Catalyst Web界面)
  • 抓取工具
  • “攻击组件”(正在编写应用程序以查找其他Web应用程序/站点中的XSS和SQLi漏洞)

因此理论上,GUI为爬虫创建作业,从而为“攻击组件”创建作业。

目前我在Catalyst中有一个Model,它实例化一个TheSchwartz对象,以便Web应用程序中的控制器可以将作业添加到作业队列。

我还需要创建一些工作者脚本来持续监听(/检查数据库)新的作业,以便他们可以执行所需的操作。目前TheSchwartz的数据库特定内容是在Catalyst中的模型中,我认为我不能轻易访问Catalyst之外的那些?

我不想在模型中复制TheSchwartz作业队列的数据库连接数据,然后在我的作业工作者脚本中复制数据库连接数据。我应该在位于Catalyst外部的另一个类中包装TheSchwartz对象的创建,并在当前实例化TheSchwartz对象的模型中调用它吗?然后我也可以在工作脚本中使用它。或者我应该在配置文件中包含数据库数据并在需要时实例化新的TheSchwartz对象(在Catalyst /内部作业工作者脚本中)?

或者我只是在想这个?

一些关于内容丰富的Web应用程序架构文章的链接也可能很有用(我之前从未构建过一种复杂的复杂性。)。

干杯

3 个答案:

答案 0 :(得分:4)

您使用的是DBIx :: Class吗?即使你不是,这里的基本思想也适用,但我会继续并假设你是。

Catalyst模型应该是另一个类的包装器,提供足够的行为来与Catalyst接口,而不是其他任何东西。例如,Catalyst :: Model :: DBIC :: Schema只是DBIx :: Class :: Schema的包装器。它从Catalyst获取配置并将其传递给DBIC,它将ResultSet注入到模型命名空间中(这样你就可以执行$c->model('DB::Table')技巧),然后就可以了。

优点是,由于所有重要的代码都存在于Catalyst :: Model之外,因此它完全独立于Catalyst。您可以从维护脚本或作业队员或其他任何工作人员加载您的Schema,传递一些配置,告诉它连接并去,而不必调用Catalyst。 ResultSet中的所有信息和逻辑以及其他任何信息和逻辑在Catalyst之外都是同样可用的。

答案 1 :(得分:3)

如果我理解正确,那么您的问题是“如何在Catalyst之外重用我的数据库连接?”。

您应该在Catalyst应用程序中使用DBIx :: Class。您可以在任何其他应用程序中重用相同的文件。催化剂中的$c->mode('DB::MyTable')->search(...)与催化剂外的相同:

my $schema = MyApp::Model::DB->new();
$schema->resultset('MyTable')->search(...)

任何模型都可以在Catalyst之外调用,就像常规包MyApp :: Model :: Library-> new()一样。您只是想确保不使用$ c作为参数。

答案 2 :(得分:2)

您应该关注的一件事是使用TheSchwartz::Simple创建作业而不是TheSchwartz本身(您实际上只需要处理作业)。优点是:

  • 轻量级(无需将整个TheSchwartz加载到Catalyst应用程序中)
  • 接受一个简单的数据库句柄来连接数据库,而TheSchwartz基本上拥有它自己的数据库包装层,并希望你给它用户名和密码并管理它自己的连接(你说你不想要它要做的事)