【问题标题】:How should I best structure my web application using job queues [and Perl/Catalyst]?我应该如何使用作业队列 [和 Perl/Catalyst] 最好地构建我的 Web 应用程序?
【发布时间】:2010-12-09 23:40:41
【问题描述】:

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

我想要使用作业队列,因为我想要尽可能多地从 Web 应用程序接口代码中分离出特定于应用程序的代码。

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

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

所以理论上 GUI 会为爬虫创建作业,而爬虫又会为“攻击组件”创建作业。

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

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

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

或者我只是在想这个?

一些丰富的网络应用架构文章的链接也可能有用(我以前从未构建过中等复杂度的文章......)。

干杯

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 如果您这样做,很多模型将无法工作。它使应用程序类为空且未初始化配置,并且它不调用 ACCEPT_CONTEXT,因此根据 推荐 适配器模式编写的模型根本无法真正工作。
      【解决方案3】:

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

      Catalyst 模型应该是另一个类的包装器,只提供与 Catalyst 接口的足够行为,仅此而已。例如 Catalyst::Model::DBIC::Schema 只是 DBIx::Class::Schema 的包装器。它从 Catalyst 获取配置并将其传递给 DBIC,将 ResultSets 注入 Model 命名空间(这样您就可以使用 $c->model('DB::Table') 技巧),然后它就离开了。

      优势在于,由于所有重要代码都位于 Catalyst::Model 之外,因此它完全独立于 Catalyst。您可以从维护脚本或作业队列工作者或其他任何东西加载您的模式,将一些配置传递给它,告诉它连接并继续,而无需调用 Catalyst。 ResultSets 中的所有信息和逻辑以及在 Catalyst 外部和内部同样可用的任何其他信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多