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

我应该如何最好地使用作业队列[和Perl/Catalyst]构造web应用程序?,perl,architecture,catalyst,web-applications,job-queue,Perl,Architecture,Catalyst,Web Applications,Job Queue,我正在使用编写一个web应用程序。我还使用了一个名为的作业队列 我希望使用作业队列,因为我希望尽可能多的应用程序特定代码与web应用程序接口代码解耦 基本上,整个系统由三个主要部分组成: GUI(Catalyst web界面) 爬虫 “攻击组件”(编写该应用程序是为了查找其他Web应用程序/站点中的XSS和SQLi漏洞) 因此,理论上,GUI为爬虫程序创建作业,而爬虫程序又为“攻击组件”创建作业 目前我在Catalyst中有一个模型,它实例化了一个TheSchwartz对象,这样web应用程

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

我希望使用作业队列,因为我希望尽可能多的应用程序特定代码与web应用程序接口代码解耦

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

  • GUI(Catalyst web界面)
  • 爬虫
  • “攻击组件”(编写该应用程序是为了查找其他Web应用程序/站点中的XSS和SQLi漏洞)
因此,理论上,GUI为爬虫程序创建作业,而爬虫程序又为“攻击组件”创建作业

目前我在Catalyst中有一个模型,它实例化了一个TheSchwartz对象,这样web应用程序中的控制器就可以将作业添加到作业队列中

我还需要创建一些job worker脚本,以持续侦听(/检查数据库)新作业,以便它们可以执行所需的操作。目前,在Catalyst中的模型中包含了Schwartz的DB特定内容,我认为我无法在Catalyst之外轻松访问这些内容

我不想在模型中复制Schwartz作业队列的DB连接数据,然后在我的作业人员脚本中复制。我是否应该将Schwartz对象的创建包装在Catalyst之外的另一个类中,并在当前实例化Schwartz对象的模型中调用它?然后我也可以在worker脚本中使用它。或者我应该将DB数据保存在配置文件中,并在需要时实例化新的TheSchwartz对象(在Catalyst/job worker脚本中)

还是我只是想得太多了

一些指向丰富的web应用程序架构文章的链接可能也很有用(我以前从未构建过一个中等复杂度的应用程序..)


干杯

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

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


优点是,由于所有重要代码都位于Catalyst::Model之外,因此它完全独立于Catalyst。您可以从维护脚本或jobqueue worker或其他任何东西加载模式,向其传递一些配置,告诉它连接并运行,而无需调用Catalyst。您的结果集中的所有信息和逻辑以及Catalyst外部和内部同等可用的任何其他信息和逻辑。

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

您应该在Catalyst应用程序中使用DBIx::Class。您可以在任何其他应用程序中重用相同的文件<代码>$c->mode('DB::MyTable')->在Catalyst中搜索(…)与Catalyst外部的相同:

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

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

您应该注意的一点是,使用它来创建作业,而不是使用Schwartz本身(您实际上只需要使用它来处理作业)。优点是:

  • 轻量级(无需将整个Schwartz加载到您的Catalyst应用程序中)
  • 接受一个简单的数据库句柄来连接到数据库,而TheSchwartz实际上有它自己的数据库包装层,希望您为它提供用户名和密码,并管理它自己的连接(您说过不希望它这样做)

如果您这样做,许多型号将无法工作。它使app类为空且未初始化config,并且不调用ACCEPT_CONTEXT,因此根据推荐的适配器模式编写的模型根本无法工作。