代码之家  ›  专栏  ›  技术社区  ›  Adam Taylor

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

  •  7
  • Adam Taylor  · 技术社区  · 15 年前

    我正在使用 Catalyst framework . 我也在使用一个名为 TheSchwartz .

    我想要使用一个作业队列,因为我想要的应用程序特定的代码和Web应用程序接口代码一样多。

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

    • GUI(Catalyst Web界面)
    • 爬虫
    • “攻击组件”(正在编写该应用程序以查找其他webapps/站点中的XSS和SQLI漏洞)

    因此在理论上,图形用户界面为爬虫创造了工作机会,而爬虫又为“攻击组件”创造了工作机会。

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

    我还需要创建一些连续监听(检查数据库)新作业的作业工作者脚本,以便他们执行所需的操作。目前,在Catalyst中,针对schwartz的数据库特定的东西在模型中,我认为在Catalyst之外我无法轻松访问它?

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

    或者我只是想过头了?

    一些链接到丰富的Web应用程序架构文章可能也很有用(我以前从未建立过一个中等复杂度的网站…)。

    干杯

    3 回复  |  直到 15 年前
        1
  •  4
  •   hobbs    15 年前

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

    Catalyst模型应该是另一个类的包装器,只提供与Catalyst接口的足够行为,而不提供其他任何行为。例如,Catalyst::Model::DBIC::Schema只是DBIX::Class::Schema的包装器。它从Catalyst获取配置并将其传递给DBIC,它将结果集注入模型名称空间(以便您可以执行 $c->model('DB::Table') 然后它就消失了。

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

        2
  •  3
  •   friedo    15 年前

    如果我理解正确,您的问题是“如何在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作为参数。

        3
  •  2
  •   Mark Fowler    15 年前

    你应该看看的一件事是 TheSchwartz::Simple 创造就业机会而不是施瓦茨本身(你真正需要的只是处理就业机会)。其优点是:

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